Skip to content

Commit 487e90d

Browse files
committed
Add auto-edit on typing
1 parent db77726 commit 487e90d

File tree

4 files changed

+97
-36
lines changed

4 files changed

+97
-36
lines changed
Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,37 @@
11
package ladysnake.translatorhelper.application;
22

3-
import javafx.collections.FXCollections;
43
import javafx.collections.ObservableList;
5-
import javafx.scene.control.ButtonType;
6-
import javafx.scene.control.ComboBox;
7-
import javafx.scene.control.Dialog;
8-
import javafx.scene.control.TextField;
4+
import javafx.scene.control.*;
95
import javafx.scene.layout.GridPane;
106

11-
import java.util.List;
127
import java.util.regex.Pattern;
138

149
public class FindReplaceDialog extends Dialog<FindReplaceDialog.FindReplaceParameters> {
1510
private ComboBox<String> fromLang, toLang;
1611
private TextField regex, replace;
12+
private CheckBox replaceExistingTranslations;
1713

18-
public FindReplaceDialog(List<String> languages) {
19-
this(FXCollections.observableList(languages), "", "", "", "");
14+
public FindReplaceDialog(ObservableList<String> languages) {
15+
this(languages, languages.isEmpty() ? "" : languages.get(0),
16+
languages.size() > 1 ? languages.get(1) : (languages.isEmpty() ? "" : languages.get(0)),
17+
"", "");
2018
}
2119

22-
public FindReplaceDialog(ObservableList<String> languages, String fromLang, String toLang, String regex, String replace) {
20+
private FindReplaceDialog(ObservableList<String> languages, String fromLang, String toLang, String regex, String replace) {
2321
this.fromLang = new ComboBox<>(languages);
2422
this.fromLang.getSelectionModel().select(fromLang);
2523
this.toLang = new ComboBox<>(languages);
2624
this.toLang.getSelectionModel().select(toLang);
2725
this.regex = new TextField(regex);
2826
this.replace = new TextField(replace);
27+
this.replaceExistingTranslations = new CheckBox("Replace existing translations");
28+
this.replaceExistingTranslations.setSelected(true);
2929
GridPane grid = new GridPane();
3030
grid.add(this.fromLang, 1, 1);
3131
grid.add(this.toLang, 3, 1);
3232
grid.add(this.regex, 1, 2, 2, 1);
3333
grid.add(this.replace, 3, 2, 2, 1);
34+
grid.add(this.replaceExistingTranslations, 1, 3);
3435
this.getDialogPane().setContent(grid);
3536
this.setTitle("Search and replace");
3637
this.setHeaderText("Search for a string from a language and convert it to something else");
@@ -39,15 +40,37 @@ public FindReplaceDialog(ObservableList<String> languages, String fromLang, Stri
3940
this.setResultConverter(type -> type == ButtonType.APPLY ? new FindReplaceParameters() : null);
4041
}
4142

43+
public void setFromLang(String fromLang) {
44+
this.fromLang.getSelectionModel().select(fromLang);
45+
}
46+
47+
public void setToLang(String toLang) {
48+
this.toLang.getSelectionModel().select(toLang);
49+
}
50+
51+
public void setRegex(String regex) {
52+
this.regex.setText(regex == null ? "" : regex);
53+
}
54+
55+
public void setReplace(String replace) {
56+
this.replace.setText(replace);
57+
}
58+
59+
public void setReplaceExistingTranslations(boolean replaceExistingTranslations) {
60+
this.replaceExistingTranslations.setSelected(replaceExistingTranslations);
61+
}
62+
4263
public class FindReplaceParameters {
4364
public final String fromLang, toLang, replace;
4465
public final Pattern regex;
66+
public final boolean replaceExistingTranslations;
4567

4668
FindReplaceParameters() {
4769
this.fromLang = FindReplaceDialog.this.fromLang.getValue();
4870
this.toLang = FindReplaceDialog.this.toLang.getValue();
4971
this.regex = Pattern.compile(FindReplaceDialog.this.regex.getText());
5072
this.replace = FindReplaceDialog.this.replace.getText();
73+
this.replaceExistingTranslations = FindReplaceDialog.this.replaceExistingTranslations.isSelected();
5174
}
5275
}
5376
}

src/ladysnake/translatorhelper/application/TranslationHelper.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,5 @@
11
package ladysnake.translatorhelper.application;
22

3-
import java.util.List;
4-
import java.util.Map;
5-
import java.util.concurrent.ExecutorService;
6-
import java.util.concurrent.Executors;
7-
import java.util.function.Predicate;
8-
93
import javafx.application.Application;
104
import javafx.collections.ObservableList;
115
import javafx.geometry.Insets;
@@ -21,6 +15,12 @@
2115
import javafx.util.StringConverter;
2216
import ladysnake.translatorhelper.controller.ControllerFx;
2317

18+
import java.util.List;
19+
import java.util.Map;
20+
import java.util.concurrent.ExecutorService;
21+
import java.util.concurrent.Executors;
22+
import java.util.function.Predicate;
23+
2424

2525
public class TranslationHelper extends Application {
2626

@@ -145,12 +145,15 @@ public void generateTable(ObservableList<Map<String, String>> allTranslations, L
145145
}
146146

147147
borderPane.setCenter(trTable);
148+
trTable.requestFocus();
149+
trTable.getSelectionModel().select(0);
148150
}
149151

150152
public void addColumn(String lang, boolean locked) {
151153
TableColumn<Map<String, String>, String> langColumn = new TableColumn<>(lang);
152154
langColumn.setPrefWidth(300);
153-
langColumn.setCellValueFactory(new MapValueFactory(lang));
155+
//noinspection unchecked
156+
langColumn.setCellValueFactory(new MapValueFactory(lang));
154157
langColumn.setCellFactory(cellFactoryForMap);
155158
langColumn.setEditable(!locked);
156159
langColumn.setOnEditCommit(control::onEditCommit);

src/ladysnake/translatorhelper/controller/ControllerFx.java

Lines changed: 51 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,12 @@
11
package ladysnake.translatorhelper.controller;
22

3-
import java.io.File;
4-
import java.io.IOException;
5-
import java.text.NumberFormat;
6-
import java.text.ParseException;
7-
import java.util.*;
8-
import java.util.concurrent.ExecutionException;
9-
import java.util.regex.Pattern;
10-
import java.util.stream.Collectors;
11-
12-
import javafx.beans.property.IntegerProperty;
13-
import javafx.beans.property.StringProperty;
14-
import javafx.beans.value.ObservableValue;
3+
import javafx.collections.FXCollections;
4+
import javafx.collections.ObservableList;
155
import javafx.concurrent.Task;
166
import javafx.event.ActionEvent;
177
import javafx.scene.control.*;
188
import javafx.scene.control.Alert.AlertType;
9+
import javafx.scene.control.Dialog;
1910
import javafx.scene.control.TableColumn.CellEditEvent;
2011
import javafx.scene.input.*;
2112
import javafx.stage.DirectoryChooser;
@@ -25,6 +16,15 @@
2516
import ladysnake.translatorhelper.application.TranslationHelper;
2617
import ladysnake.translatorhelper.model.Data;
2718

19+
import java.awt.*;
20+
import java.io.File;
21+
import java.io.IOException;
22+
import java.util.*;
23+
import java.util.List;
24+
import java.util.concurrent.ExecutionException;
25+
import java.util.regex.Pattern;
26+
import java.util.stream.Collectors;
27+
2828
public class ControllerFx {
2929

3030
private TranslationHelper view;
@@ -91,6 +91,7 @@ public void onExit(WindowEvent event) {
9191
* Handles key combinations
9292
*/
9393
public void onKeyPressed(KeyEvent event) {
94+
if(view.getTable() == null) return;
9495
if(KeyCodeCombination.keyCombination("Ctrl+S").match(event))
9596
data.save(langFolder);
9697
else if(KeyCodeCombination.keyCombination("Ctrl+C").match(event)) {
@@ -107,12 +108,20 @@ else if(KeyCodeCombination.keyCombination("Ctrl+C").match(event)) {
107108
view.getTable().getItems().get(tablePosition.getRow()).put(tablePosition.getTableColumn().getText(), Clipboard.getSystemClipboard().getString());
108109
view.getTable().refresh();
109110
} else if(KeyCodeCombination.keyCombination("Ctrl+R").match(event)) {
110-
Dialog<FindReplaceDialog.FindReplaceParameters> findReplaceDialog;
111-
findReplaceDialog = new FindReplaceDialog(view.getTable().getColumns().stream()
111+
FindReplaceDialog findReplaceDialog;
112+
ObservableList<String> availableLanguages = FXCollections.observableList(view.getTable().getColumns().stream()
112113
.map(TableColumnBase::getText)
113114
.skip(1).collect(Collectors.toList()));
115+
TableView.TableViewFocusModel focusModel = view.getTable().getFocusModel();
116+
findReplaceDialog = new FindReplaceDialog(availableLanguages);
117+
findReplaceDialog.setRegex((String) ((Map)focusModel.getFocusedItem()).get("en_us.lang"));
118+
if(focusModel.getFocusedCell().getTableColumn() != null) {
119+
String selectedLang = focusModel.getFocusedCell().getTableColumn().getText();
120+
findReplaceDialog.setToLang(selectedLang);
121+
findReplaceDialog.setReplace((String) ((Map) focusModel.getFocusedItem()).get(selectedLang));
122+
}
114123
findReplaceDialog.showAndWait().ifPresent(params ->
115-
data.searchReplace(params.fromLang, params.toLang, params.regex, params.replace));
124+
data.searchReplace(params.fromLang, params.toLang, params.regex, params.replace, params.replaceExistingTranslations));
116125
view.getTable().refresh();
117126
} else if(KeyCodeCombination.keyCombination("Ctrl+Z").match(event)) {
118127
data.undo();
@@ -125,6 +134,27 @@ else if(KeyCodeCombination.keyCombination("Ctrl+C").match(event)) {
125134
data.removeTranslation(tablePosition.getRow(), tablePosition.getTableColumn().getText());
126135
view.getTable().refresh();
127136
}
137+
} else if(event.getCode().isLetterKey()) //noinspection unchecked
138+
view.getTable().edit(view.getTable().getFocusModel().getFocusedCell().getRow(),
139+
view.getTable().getFocusModel().getFocusedCell().getTableColumn());
140+
}
141+
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();
128158
}
129159
}
130160

@@ -183,8 +213,14 @@ protected void failed() {
183213
/**
184214
* Handles changes made through the table
185215
*/
216+
@SuppressWarnings("unchecked")
186217
public void onEditCommit(CellEditEvent<Map<String, String>, String> event) {
187218
data.updateTranslation(event.getTablePosition().getRow(), event.getNewValue(), event.getTableColumn().getText());
219+
TableView.TableViewFocusModel<Map<String, String>> focusModel = view.getTable().getFocusModel();
220+
//noinspection unchecked
221+
focusModel.focus(focusModel.getFocusedCell().getRow()+1, focusModel.getFocusedCell().getTableColumn());
222+
view.getTable().getSelectionModel().clearAndSelect(focusModel.getFocusedCell().getRow(), focusModel.getFocusedCell().getTableColumn());
223+
view.getTable().requestFocus();
188224
}
189225

190226
/**

src/ladysnake/translatorhelper/model/Data.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public boolean isUnsaved() {
8787
}
8888

8989
public void setUnsaved() {
90-
editedFiles.replaceAll((s, b) -> isLocked(s) ? false : true);
90+
editedFiles.replaceAll((s, b) -> !isLocked(s));
9191
}
9292

9393
public boolean isLocked(String lang) {
@@ -159,16 +159,15 @@ public String generateTranslation(String lang, int selectedRow) throws IOExcepti
159159
if(!m1.matches())
160160
throw new IllegalArgumentException("The provided String must be a proper lang file");
161161

162-
String badTransl = TranslateAPI.translate(translationList.get(selectedRow).containsKey(EN_US)
162+
return TranslateAPI.translate(translationList.get(selectedRow).containsKey(EN_US)
163163
? translationList.get(selectedRow).get(EN_US)
164164
: translationList.get(selectedRow).getOrDefault("en_US.lang", ""), m1.group(1));
165-
return badTransl;
166165
}
167166

168-
public void searchReplace(String fromLang, String toLang, Pattern regex, String replacePattern) {
167+
public void searchReplace(String fromLang, String toLang, Pattern regex, String replacePattern, boolean replaceExistingTranslations) {
169168
for (int i = 0; i < translationList.size(); i++) {
170169
Map<String, String> translationRow = translationList.get(i);
171-
if(!translationRow.containsKey(fromLang)) continue;
170+
if(!translationRow.containsKey(fromLang) || (translationRow.containsKey(toLang) && !replaceExistingTranslations)) continue;
172171
Matcher matcher = regex.matcher(translationRow.get(fromLang));
173172
if (matcher.matches()) {
174173
String replace = replacePattern;

0 commit comments

Comments
 (0)