Menu list button with sort submenu
This commit is contained in:
@@ -30,8 +30,11 @@ import javafx.application.Application;
|
|||||||
import javafx.fxml.FXMLLoader;
|
import javafx.fxml.FXMLLoader;
|
||||||
import javafx.scene.Parent;
|
import javafx.scene.Parent;
|
||||||
import javafx.scene.Scene;
|
import javafx.scene.Scene;
|
||||||
|
import javafx.scene.input.KeyCode;
|
||||||
|
import javafx.scene.input.KeyEvent;
|
||||||
import javafx.scene.text.Font;
|
import javafx.scene.text.Font;
|
||||||
import javafx.stage.Stage;
|
import javafx.stage.Stage;
|
||||||
|
import org.scenicview.ScenicView;
|
||||||
|
|
||||||
import java.util.ResourceBundle;
|
import java.util.ResourceBundle;
|
||||||
|
|
||||||
@@ -48,6 +51,12 @@ public class GeoFroggerFXMain extends Application {
|
|||||||
Scene scene = new Scene(root);
|
Scene scene = new Scene(root);
|
||||||
stage.setScene(scene);
|
stage.setScene(scene);
|
||||||
stage.show();
|
stage.show();
|
||||||
|
|
||||||
|
scene.setOnKeyPressed(keyEvent -> {
|
||||||
|
if (isScenicViewShortcutPressed(keyEvent)) {
|
||||||
|
ScenicView.show(scene);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadCustomFonts() {
|
private void loadCustomFonts() {
|
||||||
@@ -63,6 +72,10 @@ public class GeoFroggerFXMain extends Application {
|
|||||||
Font.loadFont(GeoFroggerFXMain.class.getResource("/fonts/FiraSansOT-RegularItalic.otf").toExternalForm(), 12);
|
Font.loadFont(GeoFroggerFXMain.class.getResource("/fonts/FiraSansOT-RegularItalic.otf").toExternalForm(), 12);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isScenicViewShortcutPressed(final KeyEvent keyEvent) {
|
||||||
|
return keyEvent.isAltDown() && keyEvent.isControlDown() && keyEvent.getCode().equals(KeyCode.V);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void stop() throws Exception {
|
public void stop() throws Exception {
|
||||||
System.out.println("stop");
|
System.out.println("stop");
|
||||||
|
|||||||
@@ -25,17 +25,22 @@
|
|||||||
*/
|
*/
|
||||||
package de.frosch95.geofrogger.fx.cachelist;
|
package de.frosch95.geofrogger.fx.cachelist;
|
||||||
|
|
||||||
|
import de.frosch95.geofrogger.application.ServiceManager;
|
||||||
import de.frosch95.geofrogger.application.SessionContext;
|
import de.frosch95.geofrogger.application.SessionContext;
|
||||||
import de.frosch95.geofrogger.application.SessionContextListener;
|
import de.frosch95.geofrogger.application.SessionContextListener;
|
||||||
import de.frosch95.geofrogger.fx.components.CacheListCell;
|
import de.frosch95.geofrogger.fx.components.CacheListCell;
|
||||||
|
import de.frosch95.geofrogger.fx.components.IconManager;
|
||||||
import de.frosch95.geofrogger.model.Cache;
|
import de.frosch95.geofrogger.model.Cache;
|
||||||
|
import de.frosch95.geofrogger.service.CacheService;
|
||||||
|
import de.frosch95.geofrogger.service.CacheSortField;
|
||||||
|
import de.frosch95.geofrogger.service.SortDirection;
|
||||||
import javafx.application.Platform;
|
import javafx.application.Platform;
|
||||||
import javafx.beans.value.ChangeListener;
|
import javafx.beans.value.ChangeListener;
|
||||||
import javafx.beans.value.ObservableValue;
|
import javafx.beans.value.ObservableValue;
|
||||||
import javafx.fxml.FXML;
|
import javafx.fxml.FXML;
|
||||||
import javafx.fxml.Initializable;
|
import javafx.fxml.Initializable;
|
||||||
import javafx.scene.control.Label;
|
import javafx.scene.control.*;
|
||||||
import javafx.scene.control.ListView;
|
import javafx.scene.image.ImageView;
|
||||||
import javafx.util.Callback;
|
import javafx.util.Callback;
|
||||||
|
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
@@ -43,6 +48,8 @@ import java.util.List;
|
|||||||
import java.util.ResourceBundle;
|
import java.util.ResourceBundle;
|
||||||
|
|
||||||
import static de.frosch95.geofrogger.fx.utils.JavaFXUtils.addClasses;
|
import static de.frosch95.geofrogger.fx.utils.JavaFXUtils.addClasses;
|
||||||
|
import static de.frosch95.geofrogger.service.CacheSortField.*;
|
||||||
|
import static de.frosch95.geofrogger.service.SortDirection.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* FXML Controller class
|
* FXML Controller class
|
||||||
@@ -53,6 +60,9 @@ public class CacheListController implements Initializable, SessionContextListene
|
|||||||
|
|
||||||
private static final String CACHE_LIST_ACTION_ICONS = "cache-list-action-icons";
|
private static final String CACHE_LIST_ACTION_ICONS = "cache-list-action-icons";
|
||||||
private final SessionContext sessionContext = SessionContext.getInstance();
|
private final SessionContext sessionContext = SessionContext.getInstance();
|
||||||
|
private final CacheService cacheService = ServiceManager.getInstance().getCacheService();
|
||||||
|
private CacheSortField currentSortField = NAME;
|
||||||
|
private SortDirection currentSortDirection = ASC;
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
private ListView cacheListView;
|
private ListView cacheListView;
|
||||||
@@ -61,10 +71,7 @@ public class CacheListController implements Initializable, SessionContextListene
|
|||||||
private Label cacheNumber;
|
private Label cacheNumber;
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
private Label filterIcon;
|
private MenuButton menuIcon;
|
||||||
|
|
||||||
@FXML
|
|
||||||
private Label sortIcon;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initializes the controller class.
|
* Initializes the controller class.
|
||||||
@@ -73,6 +80,7 @@ public class CacheListController implements Initializable, SessionContextListene
|
|||||||
* @param rb
|
* @param rb
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public void initialize(URL url, ResourceBundle rb) {
|
public void initialize(URL url, ResourceBundle rb) {
|
||||||
setSessionListener();
|
setSessionListener();
|
||||||
setCellFactory();
|
setCellFactory();
|
||||||
@@ -82,11 +90,11 @@ public class CacheListController implements Initializable, SessionContextListene
|
|||||||
sessionContext.setData("current-cache", newValue)
|
sessionContext.setData("current-cache", newValue)
|
||||||
);
|
);
|
||||||
|
|
||||||
addClasses(filterIcon, CACHE_LIST_ACTION_ICONS);
|
initListMenuButton(rb);
|
||||||
addClasses(sortIcon, CACHE_LIST_ACTION_ICONS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public void sessionContextChanged() {
|
public void sessionContextChanged() {
|
||||||
List<Cache> caches = (List<Cache>) sessionContext.getData("cache-list");
|
List<Cache> caches = (List<Cache>) sessionContext.getData("cache-list");
|
||||||
Platform.runLater(() -> {
|
Platform.runLater(() -> {
|
||||||
@@ -105,4 +113,33 @@ public class CacheListController implements Initializable, SessionContextListene
|
|||||||
sessionContext.addListener("cache-list", this);
|
sessionContext.addListener("cache-list", this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void initListMenuButton(final ResourceBundle rb) {
|
||||||
|
addClasses(menuIcon, CACHE_LIST_ACTION_ICONS);
|
||||||
|
menuIcon.setGraphic(new ImageView(IconManager.getIcon("/icons/iconmonstr-menu-icon.png", IconManager.IconSize.SMALL)));
|
||||||
|
menuIcon.getItems().addAll(createSortMenu(rb));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Menu createSortMenu(final ResourceBundle rb) {
|
||||||
|
Menu sortMenu = new Menu(rb.getString("menu.title.sort"));
|
||||||
|
sortMenu.getItems().addAll(
|
||||||
|
createSortButton(rb, NAME),
|
||||||
|
createSortButton(rb, TYPE),
|
||||||
|
createSortButton(rb, DIFFICULTY),
|
||||||
|
createSortButton(rb, TERRAIN),
|
||||||
|
createSortButton(rb, OWNER),
|
||||||
|
createSortButton(rb, PLACEDBY));
|
||||||
|
return sortMenu;
|
||||||
|
}
|
||||||
|
|
||||||
|
private MenuItem createSortButton(final ResourceBundle rb, final CacheSortField field) {
|
||||||
|
MenuItem button = new MenuItem(rb.getString("sort.cache."+field.getFieldName()));
|
||||||
|
button.setOnAction(actionEvent -> {
|
||||||
|
currentSortDirection = (field.equals(currentSortField) && currentSortDirection.equals(ASC)) ? DESC : ASC;
|
||||||
|
currentSortField = field;
|
||||||
|
sessionContext.setData("cache-list", cacheService.getAllCaches(currentSortField, currentSortDirection));
|
||||||
|
});
|
||||||
|
return button;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,18 +12,11 @@
|
|||||||
<children>
|
<children>
|
||||||
<Label alignment="CENTER_LEFT" minWidth="60.0" prefWidth="-1.0" style=" " text="%label.text.cache.list"
|
<Label alignment="CENTER_LEFT" minWidth="60.0" prefWidth="-1.0" style=" " text="%label.text.cache.list"
|
||||||
textAlignment="LEFT" textFill="WHITE" wrapText="false">
|
textAlignment="LEFT" textFill="WHITE" wrapText="false">
|
||||||
<font>
|
|
||||||
<Font size="16.0" fx:id="x1"/>
|
|
||||||
</font>
|
|
||||||
</Label>
|
</Label>
|
||||||
<Label fx:id="cacheNumber" alignment="CENTER_LEFT" minWidth="60.0" prefWidth="-1.0" maxWidth="Infinity"
|
<Label fx:id="cacheNumber" alignment="CENTER_LEFT" minWidth="60.0" prefWidth="-1.0" maxWidth="Infinity"
|
||||||
style=" " text="(0)" textAlignment="LEFT" textFill="WHITE" wrapText="false" HBox.hgrow="ALWAYS">
|
style=" " text="(0)" textAlignment="LEFT" textFill="WHITE" wrapText="false" HBox.hgrow="ALWAYS">
|
||||||
<font>
|
|
||||||
<Font size="16.0" fx:id="x1"/>
|
|
||||||
</font>
|
|
||||||
</Label>
|
</Label>
|
||||||
<Label fx:id="sortIcon"/>
|
<MenuButton fx:id="menuIcon"/>
|
||||||
<Label fx:id="filterIcon"/>
|
|
||||||
</children>
|
</children>
|
||||||
<padding>
|
<padding>
|
||||||
<Insets left="16.0" right="16.0" fx:id="x2"/>
|
<Insets left="16.0" right="16.0" fx:id="x2"/>
|
||||||
|
|||||||
@@ -59,3 +59,11 @@
|
|||||||
.slider:disabled {
|
.slider:disabled {
|
||||||
-fx-opacity: 0.8;
|
-fx-opacity: 0.8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.menu-button.cache-list-action-icons {
|
||||||
|
-fx-padding: 0 0 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-button.cache-list-action-icons .label{
|
||||||
|
-fx-padding: 2 2 2 2;
|
||||||
|
}
|
||||||
@@ -31,6 +31,8 @@ import de.frosch95.geofrogger.application.SessionContext;
|
|||||||
import de.frosch95.geofrogger.gpx.GPXReader;
|
import de.frosch95.geofrogger.gpx.GPXReader;
|
||||||
import de.frosch95.geofrogger.model.Cache;
|
import de.frosch95.geofrogger.model.Cache;
|
||||||
import de.frosch95.geofrogger.service.CacheService;
|
import de.frosch95.geofrogger.service.CacheService;
|
||||||
|
import de.frosch95.geofrogger.service.CacheSortField;
|
||||||
|
import de.frosch95.geofrogger.service.SortDirection;
|
||||||
import javafx.application.Platform;
|
import javafx.application.Platform;
|
||||||
import javafx.beans.property.ObjectProperty;
|
import javafx.beans.property.ObjectProperty;
|
||||||
import javafx.beans.property.SimpleObjectProperty;
|
import javafx.beans.property.SimpleObjectProperty;
|
||||||
@@ -54,6 +56,9 @@ import java.util.ResourceBundle;
|
|||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import static de.frosch95.geofrogger.service.CacheSortField.*;
|
||||||
|
import static de.frosch95.geofrogger.service.SortDirection.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* FXML Controller class
|
* FXML Controller class
|
||||||
*
|
*
|
||||||
@@ -170,7 +175,7 @@ public class GeofroggerController implements Initializable {
|
|||||||
@Override
|
@Override
|
||||||
protected Void call() throws Exception {
|
protected Void call() throws Exception {
|
||||||
updateStatus("Load caches from database.", ProgressIndicator.INDETERMINATE_PROGRESS);
|
updateStatus("Load caches from database.", ProgressIndicator.INDETERMINATE_PROGRESS);
|
||||||
sessionContext.setData("cache-list", cacheService.getAllCaches());
|
sessionContext.setData("cache-list", cacheService.getAllCaches(NAME, ASC));
|
||||||
updateStatus("All caches loaded.", 0);
|
updateStatus("All caches loaded.", 0);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -209,7 +214,7 @@ public class GeofroggerController implements Initializable {
|
|||||||
updateStatus("All caches are stored in database", 0);
|
updateStatus("All caches are stored in database", 0);
|
||||||
|
|
||||||
updateStatus("Load caches from database.", ProgressIndicator.INDETERMINATE_PROGRESS);
|
updateStatus("Load caches from database.", ProgressIndicator.INDETERMINATE_PROGRESS);
|
||||||
sessionContext.setData("cache-list", cacheService.getAllCaches());
|
sessionContext.setData("cache-list", cacheService.getAllCaches(NAME, ASC));
|
||||||
updateStatus("All caches loaded.", 0);
|
updateStatus("All caches loaded.", 0);
|
||||||
}
|
}
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
|
|||||||
@@ -4,6 +4,9 @@ menu.title.quit = Beenden
|
|||||||
menu.title.help = Hilfe
|
menu.title.help = Hilfe
|
||||||
menu.title.about = \u00dcber GeoFroggerFX
|
menu.title.about = \u00dcber GeoFroggerFX
|
||||||
|
|
||||||
|
menu.title.sort = Sortieren
|
||||||
|
menu.title.filter = Filtern
|
||||||
|
|
||||||
label.text.cache.list=Caches
|
label.text.cache.list=Caches
|
||||||
label.text.name=Name:
|
label.text.name=Name:
|
||||||
label.text.difficulty=Schwierigkeit:
|
label.text.difficulty=Schwierigkeit:
|
||||||
@@ -19,3 +22,10 @@ label.text.longdescription=Lange Beschreibung:
|
|||||||
|
|
||||||
tab.text.descriptions=Beschreibungen
|
tab.text.descriptions=Beschreibungen
|
||||||
tab.text.general=Allgemein
|
tab.text.general=Allgemein
|
||||||
|
|
||||||
|
sort.cache.name = GC Code
|
||||||
|
sort.cache.type = Art
|
||||||
|
sort.cache.difficulty = Schwierigkeitsgrad
|
||||||
|
sort.cache.terrain = Gel\u00E4nde
|
||||||
|
sort.cache.placedBy = Platziert von
|
||||||
|
sort.cache.owner = Betreut von
|
||||||
@@ -4,6 +4,9 @@ menu.title.quit = Quit
|
|||||||
menu.title.help = Help
|
menu.title.help = Help
|
||||||
menu.title.about = About GeoFroggerFX
|
menu.title.about = About GeoFroggerFX
|
||||||
|
|
||||||
|
menu.title.sort = Sort
|
||||||
|
menu.title.filter = Filter
|
||||||
|
|
||||||
label.text.cache.list=Caches
|
label.text.cache.list=Caches
|
||||||
label.text.name=Name:
|
label.text.name=Name:
|
||||||
label.text.difficulty=Difficulty:
|
label.text.difficulty=Difficulty:
|
||||||
@@ -19,3 +22,10 @@ label.text.longdescription=Long description:
|
|||||||
|
|
||||||
tab.text.descriptions=Descriptions
|
tab.text.descriptions=Descriptions
|
||||||
tab.text.general=General
|
tab.text.general=General
|
||||||
|
|
||||||
|
sort.cache.name = GC Code
|
||||||
|
sort.cache.type = Type
|
||||||
|
sort.cache.difficulty = Difficulty
|
||||||
|
sort.cache.terrain = Terrain
|
||||||
|
sort.cache.placedBy = Placed by
|
||||||
|
sort.cache.owner = Owner
|
||||||
@@ -36,7 +36,7 @@ import java.util.List;
|
|||||||
public interface CacheService {
|
public interface CacheService {
|
||||||
void storeCaches(List<Cache> caches);
|
void storeCaches(List<Cache> caches);
|
||||||
|
|
||||||
List<Cache> getAllCaches();
|
List<Cache> getAllCaches(CacheSortField sortField, SortDirection direction);
|
||||||
|
|
||||||
void addListener(ProgressListener listener);
|
void addListener(ProgressListener listener);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,13 +74,20 @@ public class CacheServiceImpl implements CacheService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Cache> getAllCaches() {
|
@SuppressWarnings("unchecked")
|
||||||
|
public List<Cache> getAllCaches(CacheSortField sortField, SortDirection direction) {
|
||||||
|
|
||||||
EntityManager em = dbService.getEntityManager();
|
|
||||||
List<Cache> caches = new ArrayList<>();
|
List<Cache> caches = new ArrayList<>();
|
||||||
List<Cache> result = em.createQuery("select c from Cache c").getResultList();
|
try {
|
||||||
if (result != null) {
|
EntityManager em = dbService.getEntityManager();
|
||||||
caches = result;
|
String query = "select c from Cache c order by c."+sortField.getFieldName()+" "+direction.toString();
|
||||||
|
System.out.println("query: "+query);
|
||||||
|
List<Cache> result = em.createQuery(query).getResultList();
|
||||||
|
if (result != null) {
|
||||||
|
caches = result;
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
return caches;
|
return caches;
|
||||||
|
|||||||
25
src/de/frosch95/geofrogger/service/CacheSortField.java
Normal file
25
src/de/frosch95/geofrogger/service/CacheSortField.java
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
package de.frosch95.geofrogger.service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sort fields on cache object
|
||||||
|
*
|
||||||
|
* @author abi
|
||||||
|
*/
|
||||||
|
public enum CacheSortField {
|
||||||
|
NAME("name"),
|
||||||
|
TYPE("type"),
|
||||||
|
DIFFICULTY("difficulty"),
|
||||||
|
TERRAIN("terrain"),
|
||||||
|
PLACEDBY("placedBy"),
|
||||||
|
OWNER("owner");
|
||||||
|
|
||||||
|
private String fieldName;
|
||||||
|
|
||||||
|
private CacheSortField(String fieldName) {
|
||||||
|
this.fieldName = fieldName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFieldName() {
|
||||||
|
return fieldName;
|
||||||
|
}
|
||||||
|
}
|
||||||
11
src/de/frosch95/geofrogger/service/SortDirection.java
Normal file
11
src/de/frosch95/geofrogger/service/SortDirection.java
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
package de.frosch95.geofrogger.service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* direction of sorting
|
||||||
|
*
|
||||||
|
* @author abi
|
||||||
|
*/
|
||||||
|
public enum SortDirection {
|
||||||
|
ASC,
|
||||||
|
DESC
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user