From 7af63dff84915f3c80cc690650ce49105e145363 Mon Sep 17 00:00:00 2001 From: Alex Eng Date: Thu, 28 Jun 2012 10:51:35 +1000 Subject: [PATCH] Work in progress: centralising keyboard shortcut --- .../editor/table/TargetContentsPresenter.java | 94 ++++++++++++------- .../presenter/KeyShortcutPresenter.java | 27 +++++- .../presenter/TranslationPresenter.java | 46 +++++---- .../client/resources/TableEditorMessages.java | 18 +++- .../client/resources/WebTransMessages.java | 3 + 5 files changed, 124 insertions(+), 64 deletions(-) diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TargetContentsPresenter.java b/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TargetContentsPresenter.java index 23a44094ae..bb6d9121a4 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TargetContentsPresenter.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TargetContentsPresenter.java @@ -111,7 +111,7 @@ public class TargetContentsPresenter implements TargetContentsDisplay.Listener, private final CachingDispatchAsync dispatcher; @Inject - public TargetContentsPresenter(Provider displayProvider, final CachingDispatchAsync dispatcher, final Identity identity, final EventBus eventBus, final TableEditorMessages messages, final SourceContentsPresenter sourceContentsPresenter, final UserSessionService sessionService, UserConfigHolder configHolder, WorkspaceContext workspaceContext, Scheduler scheduler, ValidationMessagePanelDisplay validationMessagePanel, final KeyShortcutPresenter keyShortcutPresenter) + public TargetContentsPresenter(Provider displayProvider, final CachingDispatchAsync dispatcher, final Identity identity, final EventBus eventBus, final TableEditorMessages messages, final SourceContentsPresenter sourceContentsPresenter, final UserSessionService sessionService, final UserConfigHolder configHolder, WorkspaceContext workspaceContext, Scheduler scheduler, ValidationMessagePanelDisplay validationMessagePanel, final KeyShortcutPresenter keyShortcutPresenter) { this.displayProvider = displayProvider; this.eventBus = eventBus; @@ -170,69 +170,78 @@ public void onKeyShortcut(KeyShortcutEvent event) } }; + // Register shortcut CTRL+ALT+1 to copy result from TM result 1 keyShortcutPresenter.registerKeyShortcut(new KeyShortcut(KeyShortcut.CTRL_ALT_KEYS, KeyShortcut.KEY_1, ShortcutContext.Edit, messages.copyFromTM("1"), copyTM1Handler)); keyShortcutPresenter.registerKeyShortcut(new KeyShortcut(KeyShortcut.CTRL_ALT_KEYS, KeyShortcut.KEY_1_NUM, ShortcutContext.Edit, messages.copyFromTM("1"), copyTM1Handler, false)); + // Register shortcut CTRL+ALT+2 to copy result from TM result 2 keyShortcutPresenter.registerKeyShortcut(new KeyShortcut(KeyShortcut.CTRL_ALT_KEYS, KeyShortcut.KEY_2, ShortcutContext.Edit, messages.copyFromTM("2"), copyTM2Handler)); keyShortcutPresenter.registerKeyShortcut(new KeyShortcut(KeyShortcut.CTRL_ALT_KEYS, KeyShortcut.KEY_2_NUM, ShortcutContext.Edit, messages.copyFromTM("2"), copyTM2Handler, false)); + // Register shortcut CTRL+ALT+3 to copy result from TM result 3 keyShortcutPresenter.registerKeyShortcut(new KeyShortcut(KeyShortcut.CTRL_ALT_KEYS, KeyShortcut.KEY_3, ShortcutContext.Edit, messages.copyFromTM("3"), copyTM3Handler)); keyShortcutPresenter.registerKeyShortcut(new KeyShortcut(KeyShortcut.CTRL_ALT_KEYS, KeyShortcut.KEY_3_NUM, ShortcutContext.Edit, messages.copyFromTM("3"), copyTM3Handler, false)); - + + // Register shortcut CTRL+ALT+4 to copy result from TM result 4 keyShortcutPresenter.registerKeyShortcut(new KeyShortcut(KeyShortcut.CTRL_ALT_KEYS, KeyShortcut.KEY_4, ShortcutContext.Edit, messages.copyFromTM("4"), copyTM4Handler)); keyShortcutPresenter.registerKeyShortcut(new KeyShortcut(KeyShortcut.CTRL_ALT_KEYS, KeyShortcut.KEY_4_NUM, ShortcutContext.Edit, messages.copyFromTM("4"), copyTM4Handler, false)); - - + KeyShortcutEventHandler moveNextKeyHandler = new KeyShortcutEventHandler() { - + @Override public void onKeyShortcut(KeyShortcutEvent event) { moveNext(false); } }; - + KeyShortcutEventHandler movePreviousKeyHandler = new KeyShortcutEventHandler() { - + @Override public void onKeyShortcut(KeyShortcutEvent event) { movePrevious(false); } }; - + + // Register shortcut ALT+(Down/K) to move next row and open editor keyShortcutPresenter.registerKeyShortcut(new KeyShortcut(KeyShortcut.ALT_KEY, KeyCodes.KEY_DOWN, ShortcutContext.Edit, messages.moveToNextRow(), moveNextKeyHandler)); keyShortcutPresenter.registerKeyShortcut(new KeyShortcut(KeyShortcut.ALT_KEY, KeyShortcut.KEY_K, ShortcutContext.Edit, messages.moveToNextRow(), moveNextKeyHandler)); - + + // Register shortcut ALT+(Up/J) to move previous row and open editor keyShortcutPresenter.registerKeyShortcut(new KeyShortcut(KeyShortcut.ALT_KEY, KeyCodes.KEY_UP, ShortcutContext.Edit, messages.moveToPreviousRow(), movePreviousKeyHandler)); keyShortcutPresenter.registerKeyShortcut(new KeyShortcut(KeyShortcut.ALT_KEY, KeyShortcut.KEY_J, ShortcutContext.Edit, messages.moveToPreviousRow(), movePreviousKeyHandler)); - - keyShortcutPresenter.registerKeyShortcut(new KeyShortcut(KeyShortcut.ALT_KEY, KeyCodes.KEY_PAGEDOWN, ShortcutContext.Edit, messages.moveToNextStateEntry(), new KeyShortcutEventHandler() + + // Register shortcut ALT+(PageDown) to move next state entry - if modal + // navigation is enabled + keyShortcutPresenter.registerKeyShortcut(new KeyShortcut(KeyShortcut.ALT_KEY, KeyCodes.KEY_PAGEDOWN, ShortcutContext.Edit, messages.moveToNextStateRow(), new KeyShortcutEventHandler() { @Override public void onKeyShortcut(KeyShortcutEvent event) { - if(isModalNavEnabled) + if (isModalNavEnabled) { moveToNextState(NavTransUnitEvent.NavigationType.NextEntry); } } })); - - keyShortcutPresenter.registerKeyShortcut(new KeyShortcut(KeyShortcut.ALT_KEY, KeyCodes.KEY_PAGEUP, ShortcutContext.Edit, messages.moveToNextStateEntry(), new KeyShortcutEventHandler() + + // Register shortcut ALT+(PageUp) to move previous state entry - if modal navigation is enabled + keyShortcutPresenter.registerKeyShortcut(new KeyShortcut(KeyShortcut.ALT_KEY, KeyCodes.KEY_PAGEUP, ShortcutContext.Edit, messages.moveToPreviousStateRow(), new KeyShortcutEventHandler() { @Override public void onKeyShortcut(KeyShortcutEvent event) { - if(isModalNavEnabled) + if (isModalNavEnabled) { moveToNextState(NavTransUnitEvent.NavigationType.PrevEntry); } } })); - + + // Register shortcut CTRL+S to save as fuzzy keyShortcutPresenter.registerKeyShortcut(new KeyShortcut(KeyShortcut.CTRL_KEY, KeyShortcut.KEY_S, ShortcutContext.Edit, messages.saveAsFuzzy(), new KeyShortcutEventHandler() { @Override @@ -241,6 +250,43 @@ public void onKeyShortcut(KeyShortcutEvent event) saveAsFuzzy(); } }, KeyShortcut.KEY_DOWN_EVENT, true, true, true)); + + // Register shortcut CTRL+ENTER to save as approved + keyShortcutPresenter.registerKeyShortcut(new KeyShortcut(KeyShortcut.CTRL_KEY, KeyCodes.KEY_ENTER, ShortcutContext.Edit, messages.saveAsApproved(), new KeyShortcutEventHandler() + { + @Override + public void onKeyShortcut(KeyShortcutEvent event) + { + saveAsApprovedAndMoveNext(); + } + }, KeyShortcut.KEY_DOWN_EVENT, true, true, true)); + + // Register shortcut ENTER to save as approved (if configHolder.isButtonEnter() = true) + keyShortcutPresenter.registerKeyShortcut(new KeyShortcut(0, KeyCodes.KEY_ENTER, ShortcutContext.Edit, messages.saveAsApprovedEnter(), new KeyShortcutEventHandler() + { + @Override + public void onKeyShortcut(KeyShortcutEvent event) + { + if (configHolder.isButtonEnter()) + { + saveAsApprovedAndMoveNext(); + } + } + }, KeyShortcut.KEY_DOWN_EVENT, true, true, true)); + + + // Register shortcut ESC to close editor - (if configHolder.isButtonEsc() = true) + keyShortcutPresenter.registerKeyShortcut(new KeyShortcut(0, KeyCodes.KEY_ESCAPE, ShortcutContext.Edit, messages.closeEditor(), new KeyShortcutEventHandler() + { + @Override + public void onKeyShortcut(KeyShortcutEvent event) + { + if (configHolder.isButtonEsc() && !keyShortcutPresenter.getDisplay().isShowing()) + { + onCancel(); + } + } + })); } private ToggleEditor getCurrentEditor() @@ -632,22 +678,6 @@ public void onEditorKeyDown(KeyDownEvent event, ToggleEditor editor) { copySource(editor); } - else if (checkKey.isSaveAsFuzzyKey()) - { -// event.stopPropagation(); -// event.preventDefault(); // stop browser save -// saveAsFuzzy(); - } - else if (checkKey.isSaveAsApprovedKey(configHolder.isButtonEnter())) - { - event.stopPropagation(); - event.preventDefault(); - saveAsApprovedAndMoveNext(); - } - else if (checkKey.isCloseEditorKey(configHolder.isButtonEsc())) - { - onCancel(); - } else if (checkKey.isUserTyping() && checkKey.isEnterKey()) { // because enter itself will increase one line diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/KeyShortcutPresenter.java b/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/KeyShortcutPresenter.java index cfdf485919..3e23071b87 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/KeyShortcutPresenter.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/KeyShortcutPresenter.java @@ -71,8 +71,10 @@ public interface Display extends WidgetDisplay void showPanel(); public void clearPanel(); - - // hide method not provided as auto-hide is enabled + + boolean isShowing(); + + void hide(boolean autoClosed); } /** @@ -97,9 +99,12 @@ public KeyShortcutPresenter(Display display, EventBus eventBus, final WebTransMe keyDisplayMap.put(KeyShortcut.META_KEY, "Meta"); keyDisplayMap.put(KeyShortcut.CTRL_KEY, "Ctrl"); - keyDisplayMap.put(KeyCodes.KEY_DOWN, "Down Arrow"); - keyDisplayMap.put(KeyCodes.KEY_UP, "Up Arrow"); + keyDisplayMap.put(KeyCodes.KEY_DOWN, "Down"); + keyDisplayMap.put(KeyCodes.KEY_UP, "Up"); keyDisplayMap.put(KeyCodes.KEY_ENTER, "Enter"); + keyDisplayMap.put(KeyCodes.KEY_PAGEDOWN, "Page Down"); + keyDisplayMap.put(KeyCodes.KEY_PAGEUP, "Page Up"); + keyDisplayMap.put(KeyCodes.KEY_ESCAPE, "Esc"); } @Override @@ -126,11 +131,23 @@ public void onPreviewNativeEvent(NativePreviewEvent event) } }); + registerKeyShortcut(new KeyShortcut(0, KeyCodes.KEY_ESCAPE, ShortcutContext.Application, messages.closeShortcutView(), new KeyShortcutEventHandler() + { + @Override + public void onKeyShortcut(KeyShortcutEvent event) + { + if(display.isShowing()) + { + display.hide(true); + } + } + })); + + // could try to use ?, although this is not as simple as passing character // '?' registerKeyShortcut(new KeyShortcut(KeyShortcut.ALT_KEY, 'Y', ShortcutContext.Application, messages.showAvailableKeyShortcuts(), new KeyShortcutEventHandler() { - @Override public void onKeyShortcut(KeyShortcutEvent event) { diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/TranslationPresenter.java b/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/TranslationPresenter.java index cb3a596384..e743d87eb9 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/TranslationPresenter.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/TranslationPresenter.java @@ -264,10 +264,7 @@ public void onValueChange(ValueChangeEvent event) @Override public void onKeyShortcut(KeyShortcutEvent event) { - if (isEditorInFocus()) - { - translationEditorPresenter.gotoPrevRow(false); - } + translationEditorPresenter.gotoPrevRow(false); } }; @@ -276,26 +273,25 @@ public void onKeyShortcut(KeyShortcutEvent event) @Override public void onKeyShortcut(KeyShortcutEvent event) { - if (isEditorInFocus()) - { - translationEditorPresenter.gotoNextRow(false); - } + translationEditorPresenter.gotoNextRow(false); } }; + // Register shortcut ALT+(UP/J) for previous row navigation keyShortcutPresenter.registerKeyShortcut(new KeyShortcut(KeyShortcut.ALT_KEY, KeyCodes.KEY_UP, ShortcutContext.Navigation, messages.navigateToNextRow(), gotoPreRowHandler, KeyShortcut.KEY_DOWN_EVENT, true, true, true)); keyShortcutPresenter.registerKeyShortcut(new KeyShortcut(KeyShortcut.ALT_KEY, KeyShortcut.KEY_J, ShortcutContext.Navigation, messages.navigateToNextRow(), gotoPreRowHandler, KeyShortcut.KEY_DOWN_EVENT, true, true, true)); + // Register shortcut ALT+(Down/K) for next row navigation keyShortcutPresenter.registerKeyShortcut(new KeyShortcut(KeyShortcut.ALT_KEY, KeyCodes.KEY_DOWN, ShortcutContext.Navigation, messages.navigateToPreviousRow(), gotoNextRowHandler, KeyShortcut.KEY_DOWN_EVENT, true, true, true)); keyShortcutPresenter.registerKeyShortcut(new KeyShortcut(KeyShortcut.ALT_KEY, KeyShortcut.KEY_K, ShortcutContext.Navigation, messages.navigateToPreviousRow(), gotoNextRowHandler, KeyShortcut.KEY_DOWN_EVENT, true, true, true)); - - + + // Register shortcut Enter to open editor in selected row - if no other input field is in focus keyShortcutPresenter.registerKeyShortcut(new KeyShortcut(0, KeyCodes.KEY_ENTER, ShortcutContext.Navigation, messages.openEditorInSelectedRow(), new KeyShortcutEventHandler() { @Override public void onKeyShortcut(KeyShortcutEvent event) { - if (isEditorInFocus()) + if (!isOtherInputFieldFocused()) { translationEditorPresenter.openEditorOnSelectedRow(); } @@ -303,13 +299,14 @@ public void onKeyShortcut(KeyShortcutEvent event) }, KeyShortcut.KEY_UP_EVENT, true, true, true)); } - private boolean isEditorInFocus() + private boolean isOtherInputFieldFocused() { - return !translationEditorPresenter.isTransFilterFocused() && - !transMemoryPresenter.getDisplay().isFocused() && - !glossaryPresenter.getDisplay().isFocused() && - !translationEditorPresenter.getDisplay().isPagerFocused(); + return translationEditorPresenter.isTransFilterFocused() || + transMemoryPresenter.getDisplay().isFocused() || + glossaryPresenter.getDisplay().isFocused() || + translationEditorPresenter.getDisplay().isPagerFocused(); } + @Override protected void onUnbind() { @@ -324,7 +321,8 @@ public void saveEditorPendingChange() } /** - * Handle all changes required to completely hide and unbind the south panel for read-only mode, or to undo said changes. + * Handle all changes required to completely hide and unbind the south panel + * for read-only mode, or to undo said changes. * * @param readOnly */ @@ -341,11 +339,11 @@ private void setSouthPanelReadOnly(boolean readOnly) setSouthPanelExpanded(display.getSouthPanelToggle().getValue()); } } - + /** - * Expand or collapse south panel, binding or unbinding presenters - * as appropriate. Will have no effect if the panel is already in - * the state of expansion or contraction that is specified. + * Expand or collapse south panel, binding or unbinding presenters as + * appropriate. Will have no effect if the panel is already in the state of + * expansion or contraction that is specified. * * @param expanded */ @@ -353,14 +351,14 @@ private void setSouthPanelExpanded(boolean expanded) { if (expanded == southPanelExpanded) { - return; //nothing to do + return; // nothing to do } display.setSouthPanelExpanded(expanded); southPanelExpanded = expanded; if (expanded) { bindSouthPanelPresenters(); - + TransUnit tu = translationEditorPresenter.getSelectedTransUnit(); if (tu != null) { @@ -380,7 +378,7 @@ private void bindSouthPanelPresenters() glossaryPresenter.bind(); workspaceUsersPresenter.bind(); } - + private void unbindSouthPanelPresenters() { transMemoryPresenter.unbind(); diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/resources/TableEditorMessages.java b/zanata-war/src/main/java/org/zanata/webtrans/client/resources/TableEditorMessages.java index e38f099c90..3c6b38889a 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/resources/TableEditorMessages.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/resources/TableEditorMessages.java @@ -55,9 +55,21 @@ String validationWarningsHeading(@PluralCount @DefaultMessage("Move to previous row") String moveToPreviousRow(); - @DefaultMessage("Move to next state entry") - String moveToNextStateEntry(); + @DefaultMessage("Move to next state row") + String moveToNextStateRow(); + + @DefaultMessage("Move to previous state row") + String moveToPreviousStateRow(); - @DefaultMessage("Save as fuzzy") + @DefaultMessage("Save changes as fuzzy") String saveAsFuzzy(); + + @DefaultMessage("Save changes as approved") + String saveAsApproved(); + + @DefaultMessage("Save changes as approved - if 'Enter key saves immediately' option enabled") + String saveAsApprovedEnter(); + + @DefaultMessage("Close opened editor") + String closeEditor(); } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/resources/WebTransMessages.java b/zanata-war/src/main/java/org/zanata/webtrans/client/resources/WebTransMessages.java index 89ca10d68d..84f34e447e 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/resources/WebTransMessages.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/resources/WebTransMessages.java @@ -340,4 +340,7 @@ public interface WebTransMessages extends Messages @DefaultMessage("Open editor in selected row") String openEditorInSelectedRow(); + + @DefaultMessage("Close keyboard shortcut list") + String closeShortcutView(); }