2525import java .util .regex .Pattern ;
2626import java .util .stream .Collectors ;
2727
28+ @ SuppressWarnings ("unused" )
2829public 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 ) {
0 commit comments