Skip to content

Commit

Permalink
Allow for setting a default file filter
Browse files Browse the repository at this point in the history
The file chooser configuration has been extended with a property
that allows for setting the default file filter used in the UI. The
filter must be included in the list of file filters given in the
configuration.

Fix: #9
  • Loading branch information
io7m committed Apr 11, 2021
1 parent a4a370a commit 93f6180
Show file tree
Hide file tree
Showing 6 changed files with 280 additions and 3 deletions.
9 changes: 7 additions & 2 deletions README-CHANGES.xml
Expand Up @@ -39,7 +39,7 @@
<c:change date="2020-04-10T00:00:00+00:00" summary="Enable CheckStyle to enforce code style"/>
</c:changes>
</c:release>
<c:release date="2021-04-11T15:34:52+00:00" is-open="true" ticket-system="com.github.io7m.jwheatsheaf" version="3.0.0">
<c:release date="2021-04-11T19:22:46+00:00" is-open="true" ticket-system="com.github.io7m.jwheatsheaf" version="3.0.0">
<c:changes>
<c:change date="2021-04-10T00:00:00+00:00" summary="Allow the escape key to close file choosers">
<c:tickets>
Expand All @@ -66,11 +66,16 @@
<c:ticket id="12"/>
</c:tickets>
</c:change>
<c:change date="2021-04-11T15:34:52+00:00" summary="Enable sorting of directory items">
<c:change date="2021-04-11T00:00:00+00:00" summary="Enable sorting of directory items">
<c:tickets>
<c:ticket id="22"/>
</c:tickets>
</c:change>
<c:change date="2021-04-11T19:22:46+00:00" summary="Allow for setting a default file filter">
<c:tickets>
<c:ticket id="9"/>
</c:tickets>
</c:change>
</c:changes>
</c:release>
</c:releases>
Expand Down
Expand Up @@ -101,6 +101,12 @@ public interface JWFileChooserConfigurationType

List<JWFileChooserFilterType> fileFilters();

/**
* @return The default file filter
*/

Optional<JWFileChooserFilterType> fileFilterDefault();

/**
* @return {@code true} if the UI will allow the creation of directories
*/
Expand Down Expand Up @@ -165,5 +171,13 @@ default void checkPreconditions()
this.fileSystem()
);
}

final var filterOpt = this.fileFilterDefault();
filterOpt.ifPresent(filter -> {
Preconditions.checkPreconditionV(
this.fileFilters().contains(filter),
"The default file filter must be contained in the list of filters"
);
});
}
}
@@ -0,0 +1,67 @@
/*
* Copyright © 2021 Mark Raynsford <code@io7m.com> http://io7m.com
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
* IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/

package com.io7m.jwheatsheaf.tests;

import com.io7m.jaffirm.core.PreconditionViolationException;
import com.io7m.jwheatsheaf.api.JWFileChooserConfiguration;
import com.io7m.jwheatsheaf.api.JWFileChooserFilterType;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.nio.file.FileSystems;
import java.nio.file.Path;

public final class JWFileChooserConfigurationTest
{
/**
* Trying to specify a default filter that doesn't appear in the list of
* filters fails.
*/

@Test
public void testFilterNotInList()
{
Assertions.assertThrows(PreconditionViolationException.class, () -> {
JWFileChooserConfiguration.builder()
.setFileSystem(FileSystems.getDefault())
.setFileFilterDefault(new EmptyFilter())
.build();
});
}

private static final class EmptyFilter
implements JWFileChooserFilterType
{
EmptyFilter()
{

}

@Override
public String description()
{
return "failure";
}

@Override
public boolean isAllowed(
final Path path)
{
return false;
}
}
}
@@ -0,0 +1,132 @@
/*
* Copyright © 2020 Mark Raynsford <code@io7m.com> http://io7m.com
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
* IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/

package com.io7m.jwheatsheaf.tests;

import com.io7m.jwheatsheaf.api.JWFileChooserAction;
import com.io7m.jwheatsheaf.api.JWFileChooserConfiguration;
import com.io7m.jwheatsheaf.api.JWFileChooserEventType;
import com.io7m.jwheatsheaf.api.JWFileChooserType;
import com.io7m.jwheatsheaf.api.JWFileChoosersType;
import com.io7m.jwheatsheaf.ui.JWFileChoosers;
import javafx.scene.input.KeyCode;
import javafx.stage.Stage;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInfo;
import org.junit.jupiter.api.extension.ExtendWith;
import org.testfx.api.FxAssert;
import org.testfx.api.FxRobot;
import org.testfx.framework.junit5.ApplicationExtension;
import org.testfx.framework.junit5.Start;
import org.testfx.framework.junit5.Stop;
import org.testfx.matcher.base.NodeMatchers;
import org.testfx.matcher.control.TableViewMatchers;

import java.io.IOException;
import java.nio.file.FileSystem;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

import static java.util.concurrent.TimeUnit.*;

@ExtendWith(ApplicationExtension.class)
public final class JWFileChooserFilterDefaultTest
{
private JWTestFilesystems filesystems;
private FileSystem dosFilesystem;
private FileSystem brokenFilesystem;
private FileSystem brokenFilesFilesystem;
private JWFileChooserType chooser;
private List<Path> selected;
private List<JWFileChooserEventType> events;
private JWFileChoosersType choosers;

@Start
public void start(final Stage stage)
throws Exception
{
this.events = Collections.synchronizedList(new ArrayList<>());

this.filesystems = JWTestFilesystems.create();
final var systems = this.filesystems.filesystems();
this.dosFilesystem = systems.get("ExampleDOS");
this.brokenFilesystem = systems.get("Broken");
this.brokenFilesFilesystem = systems.get("BrokenFiles");

final var filter =
new JWFileFilterHideAll();

final var configuration =
JWFileChooserConfiguration.builder()
.setAllowDirectoryCreation(true)
.setAction(JWFileChooserAction.CREATE)
.setFileSystem(this.dosFilesystem)
.addFileFilters(filter)
.setFileFilterDefault(filter)
.build();

this.choosers = JWFileChoosers.create();
this.chooser = this.choosers.create(stage, configuration);
this.chooser.setEventListener(event -> this.events.add(event));
this.chooser.show();
}

@Stop
public void stop()
throws IOException
{
this.choosers.close();
}

/**
* A "hide everything" filter set as the default... Hides everything!
*
* @param robot The FX test robot
*/

@Test
public void testFilterDefaultHidesEverything(
final FxRobot robot,
final TestInfo info)
{
JWFileWindowTitles.setTitle(this.chooser, info);

final var okButton =
robot.lookup("#fileChooserOKButton")
.queryButton();
final var cancelButton =
robot.lookup("#fileChooserCancelButton")
.queryButton();

robot.sleep(1L, SECONDS);
FxAssert.verifyThat(okButton, NodeMatchers.isDisabled());

final var tableView =
robot.lookup("#fileChooserDirectoryTable")
.queryTableView();

FxAssert.verifyThat(tableView, TableViewMatchers.hasNumRows(0));
robot.clickOn(cancelButton);

Assertions.assertEquals(List.of(), this.chooser.result());
Assertions.assertEquals(0, this.events.size());
}
}
@@ -0,0 +1,43 @@
/*
* Copyright © 2021 Mark Raynsford <code@io7m.com> http://io7m.com
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
* IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/

package com.io7m.jwheatsheaf.tests;

import com.io7m.jwheatsheaf.api.JWFileChooserFilterType;

import java.nio.file.Path;

public final class JWFileFilterHideAll
implements JWFileChooserFilterType
{
public JWFileFilterHideAll()
{

}

@Override
public String description()
{
return "Nothing!";
}

@Override
public boolean isAllowed(
final Path path)
{
return false;
}
}
Expand Up @@ -39,6 +39,7 @@
import javafx.scene.control.ListView;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.SingleSelectionModel;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
Expand Down Expand Up @@ -307,7 +308,22 @@ protected void updateItem(
filters.add(this.filterOnlyDirectories);
filters.addAll(this.configuration.fileFilters());
this.fileTypeMenu.setItems(FXCollections.observableList(filters));
this.fileTypeMenu.getSelectionModel().select(0);

/*
* Select the default filter. If there isn't one, select the first
* filter.
*/

final var selectionModel =
this.fileTypeMenu.getSelectionModel();

this.configuration.fileFilterDefault()
.ifPresentOrElse(
selectionModel::select,
() -> selectionModel.select(0)
);

this.onFileFilterSelected();
}

/**
Expand Down

0 comments on commit 93f6180

Please sign in to comment.