Skip to content

Commit c4a4b8e

Browse files
PyrofabE164487Q
authored andcommitted
Add smart directory search and some more controls
1 parent 6b8742f commit c4a4b8e

File tree

3 files changed

+59
-25
lines changed

3 files changed

+59
-25
lines changed

src/ladysnake/translatorhelper/application/TranslationHelper.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public class TranslationHelper extends Application {
3232
private ContextMenu contextMenuTable;
3333
private TableView<Map<String, String>> trTable;
3434
private Label statusLabel;
35+
private CheckBox smartSearch;
3536

3637
private Button wimpTrnslBtn;
3738
private Button saveBtn;
@@ -75,9 +76,12 @@ public void start(Stage primaryStage) {
7576
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
7677

7778
{ // load button
79+
smartSearch = new CheckBox("Use smart search");
80+
Tooltip.install(smartSearch, new Tooltip("Uses recursive search to find the most likely lang folder from a selected root."));
81+
grid.add(smartSearch, 0, 0, 1, 1);
7882
Button loadBtn = new Button("Load a lang folder");
7983
loadBtn.setOnAction(control::onChooseFolder);
80-
grid.add(loadBtn, 0, 0, 2, 1);
84+
grid.add(loadBtn, 1, 0, 1, 1);
8185
}
8286

8387
{ // save button
@@ -102,6 +106,7 @@ public void start(Stage primaryStage) {
102106
newRow.setOnAction(control::onInsertRow);
103107
newThing = new MenuButton("Add...", null, newLang, newRow);
104108
newThing.setDisable(true);
109+
newThing.setOnKeyPressed(control::onKeyPressed);
105110
grid.add(newThing, 4, 0);
106111
}
107112

@@ -160,6 +165,15 @@ public void addColumn(String lang, boolean locked) {
160165
trTable.getColumns().add(langColumn);
161166
}
162167

168+
public void showMenuNew() {
169+
this.newThing.show();
170+
this.newThing.requestFocus();
171+
}
172+
173+
public boolean isSmartSearchEnabled() {
174+
return smartSearch.isSelected();
175+
}
176+
163177
public void setStatus(String status) {
164178
this.statusLabel.setText("status: " + status);
165179
}

src/ladysnake/translatorhelper/controller/ControllerFx.java

Lines changed: 42 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.regex.Pattern;
2626
import java.util.stream.Collectors;
2727

28+
@SuppressWarnings("unused")
2829
public class ControllerFx {
2930

3031
private TranslationHelper view;
@@ -49,10 +50,17 @@ public ControllerFx(TranslationHelper view) {
4950
public void onChooseFolder(ActionEvent event) {
5051
langFolder = fileChooser.showDialog(view.getStage());
5152
if (langFolder != null) {
53+
if(view.isSmartSearchEnabled()) {
54+
view.setStatus("Starting smart search from selected folder");
55+
langFolder = findLangFolder(langFolder);
56+
}
5257
view.setStatus("loading lang files");
5358
try {
59+
File[] langFiles = langFolder.listFiles(f -> f.isFile() && LANG_PATTERN.matcher(f.getName()).matches());
60+
if(langFiles == null)
61+
throw new IOException();
5462
Map<File, Boolean> lockedFiles = new SelectFilesDialog(
55-
Arrays.asList(langFolder.listFiles(f -> f.isFile() && LANG_PATTERN.matcher(f.getName()).matches()))).showAndWait().get();
63+
Arrays.asList(langFiles)).showAndWait().orElseThrow(NoSuchElementException::new);
5664
List<String> langNames = new ArrayList<>(lockedFiles.keySet().stream()
5765
.map(File::getName)
5866
.sorted((s1, s2) -> s1.equalsIgnoreCase(Data.EN_US) ? -1 : s2.equalsIgnoreCase(Data.EN_US) ? 1 : s1.compareTo(s2))
@@ -64,10 +72,34 @@ public void onChooseFolder(ActionEvent event) {
6472
} catch (NoSuchElementException e) {
6573
System.err.println("Operation cancelled : " + e.getLocalizedMessage());
6674
view.setStatus("no lang folder selected");
67-
}
68-
}
75+
} catch (IOException e) {
76+
System.err.println("The file selected isn't a valid folder");
77+
view.setStatus("erred while reading the folder");
78+
}
79+
}
6980
}
7081

82+
private File findLangFolder(File rootFolder) {
83+
File[] subFiles = rootFolder.listFiles();
84+
if(subFiles == null || subFiles.length == 0)
85+
return rootFolder;
86+
return Arrays.stream(subFiles).filter(File::isDirectory).map(this::findLangFolder).max((f1, f2) -> {
87+
File[] langFiles1 = f1.listFiles(f -> f.isFile() && LANG_PATTERN.matcher(f.getName()).matches());
88+
File[] langFiles2 = f2.listFiles(f -> f.isFile() && LANG_PATTERN.matcher(f.getName()).matches());
89+
if(langFiles1 == null) return langFiles2 == null ? 0 : -1;
90+
if(langFiles2 == null) return 1;
91+
if(langFiles1.length > 0) {
92+
if(langFiles2.length > 0) return Integer.compare(langFiles1.length, langFiles2.length);
93+
return 1;
94+
} else if(langFiles2.length > 0) return -1;
95+
if(f1.getName().equals("lang")) return f2.getName().equals("lang") ? 0 : 1;
96+
if(f2.getName().equals("lang")) return -1;
97+
File[] subDirs = f1.listFiles(File::isDirectory);
98+
File[] subDirs1 = f2.listFiles(File::isDirectory);
99+
return Integer.compare(subDirs1 == null ? 0 : subDirs1.length, subDirs == null ? 0 : subDirs.length);
100+
}).orElse(rootFolder);
101+
}
102+
71103
/**
72104
* Handles the "Save" button
73105
*/
@@ -129,6 +161,10 @@ else if(KeyCodeCombination.keyCombination("Ctrl+C").match(event)) {
129161
} else if(KeyCodeCombination.keyCombination("Ctrl+Shift+Z").match(event) || KeyCodeCombination.keyCombination("Ctrl+Y").match(event)) {
130162
data.redo();
131163
view.getTable().refresh();
164+
} else if(KeyCodeCombination.keyCombination("Ctrl+N").match(event)) {
165+
view.showMenuNew();
166+
} else if(event.getCode().equals(KeyCode.ESCAPE)) {
167+
view.getTable().requestFocus();
132168
} else if(event.getCode().equals(KeyCode.DELETE)) {
133169
for(TablePosition tablePosition : view.getTable().getSelectionModel().getSelectedCells()) {
134170
data.removeTranslation(tablePosition.getRow(), tablePosition.getTableColumn().getText());
@@ -139,25 +175,6 @@ else if(KeyCodeCombination.keyCombination("Ctrl+C").match(event)) {
139175
view.getTable().getFocusModel().getFocusedCell().getTableColumn());
140176
}
141177

142-
@SuppressWarnings("unchecked")
143-
private void tryUseVimControls(KeyCode key) {
144-
if(view.getTable().editingCellProperty().isNotNull().get()) return;
145-
try {
146-
Robot r = new Robot();
147-
switch (key) {
148-
case H : r.keyPress(java.awt.event.KeyEvent.VK_LEFT); break;
149-
case J : r.keyPress(java.awt.event.KeyEvent.VK_DOWN); break;
150-
case K : r.keyPress(java.awt.event.KeyEvent.VK_UP); break;
151-
case L : r.keyPress(java.awt.event.KeyEvent.VK_RIGHT); break;
152-
case I : TablePosition pos = view.getTable().getFocusModel().getFocusedCell();
153-
view.getTable().edit(pos.getRow(), pos.getTableColumn());
154-
break;
155-
}
156-
} catch (AWTException e) {
157-
e.printStackTrace();
158-
}
159-
}
160-
161178
/**
162179
* Handles the auto-completion button
163180
*/
@@ -255,8 +272,10 @@ public void onInsertRow(ActionEvent event) {
255272
d.setGraphic(null);
256273
d.setHeaderText("Enter the new translation's key:");
257274
d.setTitle("New translation");
258-
d.showAndWait().ifPresent(data::addTranslation);
275+
view.getTable().getSelectionModel().clearSelection();
276+
d.showAndWait().ifPresent(key -> view.getTable().getSelectionModel().select(data.addTranslation(key)));
259277
view.getTable().sort();
278+
view.getTable().requestFocus();
260279
}
261280

262281
public void onNewFile(ActionEvent event) {

src/ladysnake/translatorhelper/model/Data.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,10 +142,11 @@ public void removeTranslation(int selectedRow, String lang) {
142142
editedFiles.put(lang, true);
143143
}
144144

145-
public void addTranslation(String key) {
145+
public Map<String, String> addTranslation(String key) {
146146
Map<String, String> newMap = new HashMap<>();
147147
newMap.put(Data.TRANSLATION_KEY, key);
148148
addTranslation(key, newMap);
149+
return newMap;
149150
}
150151

151152
private void addTranslation(String key, Map<String, String> newMap) {

0 commit comments

Comments
 (0)