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 22c5f05290..d8bd80495a 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 @@ -121,7 +121,6 @@ public class TargetContentsPresenter implements TargetContentsDisplay.Listener, private HandlerRegistration enterTriggersAutoSizeHandlerRegistration; private HandlerRegistration escClosesEditorHandlerRegistration; - @Inject 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, UserWorkspaceContext userWorkspaceContext, Scheduler scheduler, ValidationMessagePanelDisplay validationMessagePanel, final KeyShortcutPresenter keyShortcutPresenter) { @@ -145,75 +144,59 @@ public TargetContentsPresenter(Provider displayProvider, eventBus.addHandler(TransUnitEditEvent.getType(), this); eventBus.addHandler(EnableModalNavigationEvent.getType(), this); - keyShortcutPresenter.register(new KeyShortcut(Keys.setOf( - new Keys(Keys.CTRL_ALT_KEYS, Keys.KEY_1), - new Keys(Keys.CTRL_ALT_KEYS, Keys.KEY_NUM_1)), - ShortcutContext.Edit, messages.copyFromTM(1), new KeyShortcutEventHandler() - { - @Override - public void onKeyShortcut(KeyShortcutEvent event) - { - eventBus.fireEvent(new TransMemoryShortcutCopyEvent(0)); - } - })); - - keyShortcutPresenter.register(new KeyShortcut(Keys.setOf( - new Keys(Keys.CTRL_ALT_KEYS, Keys.KEY_2), - new Keys(Keys.CTRL_ALT_KEYS, Keys.KEY_NUM_2)), - ShortcutContext.Edit, messages.copyFromTM(2), new KeyShortcutEventHandler() - { - @Override - public void onKeyShortcut(KeyShortcutEvent event) - { - eventBus.fireEvent(new TransMemoryShortcutCopyEvent(1)); - } - })); - - keyShortcutPresenter.register(new KeyShortcut(Keys.setOf( - new Keys(Keys.CTRL_ALT_KEYS, Keys.KEY_3), - new Keys(Keys.CTRL_ALT_KEYS, Keys.KEY_NUM_3)), - ShortcutContext.Edit, messages.copyFromTM(3), new KeyShortcutEventHandler() - { - @Override - public void onKeyShortcut(KeyShortcutEvent event) - { - eventBus.fireEvent(new TransMemoryShortcutCopyEvent(2)); - } - })); - - keyShortcutPresenter.register(new KeyShortcut(Keys.setOf( - new Keys(Keys.CTRL_ALT_KEYS, Keys.KEY_4), - new Keys(Keys.CTRL_ALT_KEYS, Keys.KEY_NUM_4)), - ShortcutContext.Edit, messages.copyFromTM(4), new KeyShortcutEventHandler() - { - @Override - public void onKeyShortcut(KeyShortcutEvent event) - { - eventBus.fireEvent(new TransMemoryShortcutCopyEvent(3)); - } - })); - - keyShortcutPresenter.register(new KeyShortcut(Keys.setOf( - new Keys(Keys.ALT_KEY, KeyCodes.KEY_DOWN), new Keys(Keys.ALT_KEY, 'K')), - ShortcutContext.Edit, messages.moveToNextRow(), new KeyShortcutEventHandler() - { - @Override - public void onKeyShortcut(KeyShortcutEvent event) - { - moveNext(false); - } - })); - - keyShortcutPresenter.register(new KeyShortcut(Keys.setOf( - new Keys(Keys.ALT_KEY, KeyCodes.KEY_UP), new Keys(Keys.ALT_KEY, 'J')), - ShortcutContext.Edit, messages.moveToPreviousRow(), new KeyShortcutEventHandler() - { - @Override - public void onKeyShortcut(KeyShortcutEvent event) - { - movePrevious(false); - } - })); + keyShortcutPresenter.register(new KeyShortcut(Keys.setOf(new Keys(Keys.CTRL_ALT_KEYS, Keys.KEY_1), new Keys(Keys.CTRL_ALT_KEYS, Keys.KEY_NUM_1)), ShortcutContext.Edit, messages.copyFromTM(1), new KeyShortcutEventHandler() + { + @Override + public void onKeyShortcut(KeyShortcutEvent event) + { + eventBus.fireEvent(new TransMemoryShortcutCopyEvent(0)); + } + })); + + keyShortcutPresenter.register(new KeyShortcut(Keys.setOf(new Keys(Keys.CTRL_ALT_KEYS, Keys.KEY_2), new Keys(Keys.CTRL_ALT_KEYS, Keys.KEY_NUM_2)), ShortcutContext.Edit, messages.copyFromTM(2), new KeyShortcutEventHandler() + { + @Override + public void onKeyShortcut(KeyShortcutEvent event) + { + eventBus.fireEvent(new TransMemoryShortcutCopyEvent(1)); + } + })); + + keyShortcutPresenter.register(new KeyShortcut(Keys.setOf(new Keys(Keys.CTRL_ALT_KEYS, Keys.KEY_3), new Keys(Keys.CTRL_ALT_KEYS, Keys.KEY_NUM_3)), ShortcutContext.Edit, messages.copyFromTM(3), new KeyShortcutEventHandler() + { + @Override + public void onKeyShortcut(KeyShortcutEvent event) + { + eventBus.fireEvent(new TransMemoryShortcutCopyEvent(2)); + } + })); + + keyShortcutPresenter.register(new KeyShortcut(Keys.setOf(new Keys(Keys.CTRL_ALT_KEYS, Keys.KEY_4), new Keys(Keys.CTRL_ALT_KEYS, Keys.KEY_NUM_4)), ShortcutContext.Edit, messages.copyFromTM(4), new KeyShortcutEventHandler() + { + @Override + public void onKeyShortcut(KeyShortcutEvent event) + { + eventBus.fireEvent(new TransMemoryShortcutCopyEvent(3)); + } + })); + + keyShortcutPresenter.register(new KeyShortcut(Keys.setOf(new Keys(Keys.ALT_KEY, KeyCodes.KEY_DOWN), new Keys(Keys.ALT_KEY, 'K')), ShortcutContext.Edit, messages.moveToNextRow(), new KeyShortcutEventHandler() + { + @Override + public void onKeyShortcut(KeyShortcutEvent event) + { + moveNext(false); + } + })); + + keyShortcutPresenter.register(new KeyShortcut(Keys.setOf(new Keys(Keys.ALT_KEY, KeyCodes.KEY_UP), new Keys(Keys.ALT_KEY, 'J')), ShortcutContext.Edit, messages.moveToPreviousRow(), new KeyShortcutEventHandler() + { + @Override + public void onKeyShortcut(KeyShortcutEvent event) + { + movePrevious(false); + } + })); // Register shortcut ALT+(PageDown) to move next state entry - if modal // navigation is enabled @@ -231,8 +214,7 @@ public void onKeyShortcut(KeyShortcutEvent event) // Register shortcut ALT+(PageUp) to move previous state entry - if modal // navigation is enabled - keyShortcutPresenter.register(new KeyShortcut(new Keys(Keys.ALT_KEY, KeyCodes.KEY_PAGEUP), - ShortcutContext.Edit, messages.moveToPreviousStateRow(), new KeyShortcutEventHandler() + keyShortcutPresenter.register(new KeyShortcut(new Keys(Keys.ALT_KEY, KeyCodes.KEY_PAGEUP), ShortcutContext.Edit, messages.moveToPreviousStateRow(), new KeyShortcutEventHandler() { @Override public void onKeyShortcut(KeyShortcutEvent event) @@ -245,8 +227,7 @@ public void onKeyShortcut(KeyShortcutEvent event) })); // Register shortcut CTRL+S to save as fuzzy - keyShortcutPresenter.register(new KeyShortcut(new Keys(Keys.CTRL_KEY, 'S'), - ShortcutContext.Edit, messages.saveAsFuzzy(), KeyEvent.KEY_DOWN, true, true, new KeyShortcutEventHandler() + keyShortcutPresenter.register(new KeyShortcut(new Keys(Keys.CTRL_KEY, 'S'), ShortcutContext.Edit, messages.saveAsFuzzy(), KeyEvent.KEY_DOWN, true, true, new KeyShortcutEventHandler() { @Override public void onKeyShortcut(KeyShortcutEvent event) @@ -264,21 +245,16 @@ public void onKeyShortcut(KeyShortcutEvent event) } }; - keyShortcutPresenter.register(new KeyShortcut(new Keys(Keys.CTRL_KEY, KeyCodes.KEY_ENTER), - ShortcutContext.Edit, messages.saveAsApproved(), KeyEvent.KEY_DOWN, true, true, - saveAsApprovedKeyShortcutHandler)); + keyShortcutPresenter.register(new KeyShortcut(new Keys(Keys.CTRL_KEY, KeyCodes.KEY_ENTER), ShortcutContext.Edit, messages.saveAsApproved(), KeyEvent.KEY_DOWN, true, true, saveAsApprovedKeyShortcutHandler)); - enterSavesApprovedShortcut = new KeyShortcut(new Keys(Keys.NO_MODIFIER, KeyCodes.KEY_ENTER), - ShortcutContext.Edit, messages.saveAsApproved(), KeyEvent.KEY_DOWN, true, true, - saveAsApprovedKeyShortcutHandler); + enterSavesApprovedShortcut = new KeyShortcut(new Keys(Keys.NO_MODIFIER, KeyCodes.KEY_ENTER), ShortcutContext.Edit, messages.saveAsApproved(), KeyEvent.KEY_DOWN, true, true, saveAsApprovedKeyShortcutHandler); - enterTriggersAutoSizeShortcut = new KeyShortcut(new Keys(Keys.NO_MODIFIER, KeyCodes.KEY_ENTER), - ShortcutContext.Edit, KeyShortcut.DO_NOT_DISPLAY_DESCRIPTION, KeyEvent.KEY_DOWN, false, false, new KeyShortcutEventHandler() + enterTriggersAutoSizeShortcut = new KeyShortcut(new Keys(Keys.NO_MODIFIER, KeyCodes.KEY_ENTER), ShortcutContext.Edit, KeyShortcut.DO_NOT_DISPLAY_DESCRIPTION, KeyEvent.KEY_DOWN, false, false, new KeyShortcutEventHandler() { @Override public void onKeyShortcut(KeyShortcutEvent event) { - getCurrentEditor().autoSizePlusOne(); + getCurrentEditor().autoSizePlusOne(); } }); @@ -303,8 +279,7 @@ public void onKeyShortcut(KeyShortcutEvent event) } })); - escClosesEditorShortcut = new KeyShortcut(new Keys(Keys.NO_MODIFIER, KeyCodes.KEY_ESCAPE), - ShortcutContext.Edit, messages.closeEditor(), new KeyShortcutEventHandler() + escClosesEditorShortcut = new KeyShortcut(new Keys(Keys.NO_MODIFIER, KeyCodes.KEY_ESCAPE), ShortcutContext.Edit, messages.closeEditor(), new KeyShortcutEventHandler() { @Override public void onKeyShortcut(KeyShortcutEvent event) @@ -316,7 +291,8 @@ public void onKeyShortcut(KeyShortcutEvent event) } }); - if (configHolder.isEscClosesEditor()) { + if (configHolder.isEscClosesEditor()) + { escClosesEditorRegistered = true; escClosesEditorHandlerRegistration = keyShortcutPresenter.register(escClosesEditorShortcut); } @@ -695,7 +671,8 @@ public void onValueChanged(UserConfigChangeEvent event) boolean escClosesEditor = configHolder.isEscClosesEditor(); if (escClosesEditor != escClosesEditorRegistered) { - if (escClosesEditor) { + if (escClosesEditor) + { escClosesEditorHandlerRegistration = keyShortcutPresenter.register(escClosesEditorShortcut); } else @@ -722,7 +699,7 @@ public void onRequestValidation(RequestValidationEvent event) revealDisplay(); } } - + @Override public void onInsertString(final InsertStringInEditorEvent event) { @@ -798,13 +775,13 @@ public void onEnable(EnableModalNavigationEvent event) { isModalNavEnabled = event.isEnable(); } - + public void revealDisplay() { keyShortcutPresenter.setContextActive(ShortcutContext.Edit, true); keyShortcutPresenter.setContextActive(ShortcutContext.Navigation, false); } - + public void concealDisplay() { keyShortcutPresenter.setContextActive(ShortcutContext.Edit, false); diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/keys/ShortcutContext.java b/zanata-war/src/main/java/org/zanata/webtrans/client/keys/ShortcutContext.java index f512766bb2..0ec9321ee4 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/keys/ShortcutContext.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/keys/ShortcutContext.java @@ -51,5 +51,20 @@ public enum ShortcutContext /** * Used by {@link InlineTargetCellEditor} */ - Edit; + Edit, + + /** + * Used by {@link TransMemoryPresenter} + */ + TM, + + /** + * Used by {@link GlossaryPresenter} + */ + Glossary, + + /** + * Used by {@link WorkspaceUsersPresenter} + */ + Chat; } \ No newline at end of file diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/GlossaryPresenter.java b/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/GlossaryPresenter.java index c4e72dda79..6e368b03fb 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/GlossaryPresenter.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/GlossaryPresenter.java @@ -26,10 +26,16 @@ import org.zanata.common.LocaleId; import org.zanata.webtrans.client.events.InsertStringInEditorEvent; +import org.zanata.webtrans.client.events.KeyShortcutEvent; +import org.zanata.webtrans.client.events.KeyShortcutEventHandler; import org.zanata.webtrans.client.events.TransUnitSelectionEvent; import org.zanata.webtrans.client.events.TransUnitSelectionHandler; import org.zanata.webtrans.client.history.History; import org.zanata.webtrans.client.history.HistoryToken; +import org.zanata.webtrans.client.keys.KeyShortcut; +import org.zanata.webtrans.client.keys.Keys; +import org.zanata.webtrans.client.keys.ShortcutContext; +import org.zanata.webtrans.client.resources.WebTransMessages; import org.zanata.webtrans.client.rpc.CachingDispatchAsync; import org.zanata.webtrans.shared.model.DocumentId; import org.zanata.webtrans.shared.model.DocumentInfo; @@ -42,9 +48,15 @@ import com.allen_sauer.gwt.log.client.Log; import com.google.gwt.cell.client.FieldUpdater; +import com.google.gwt.event.dom.client.BlurEvent; +import com.google.gwt.event.dom.client.BlurHandler; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.dom.client.FocusEvent; +import com.google.gwt.event.dom.client.FocusHandler; +import com.google.gwt.event.dom.client.HasAllFocusHandlers; import com.google.gwt.event.dom.client.HasClickHandlers; +import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.resources.client.ImageResource; import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.client.rpc.AsyncCallback; @@ -65,11 +77,14 @@ public class GlossaryPresenter extends WidgetPresenter dataProvider; + private boolean isFocused; + private ListDataProvider dataProvider; public interface Display extends WidgetDisplay { @@ -77,12 +92,12 @@ public interface Display extends WidgetDisplay HasText getGlossaryTextBox(); + HasAllFocusHandlers getFocusGlossaryTextBox(); + HasValue getSearchType(); void startProcessing(); - boolean isFocused(); - Column getCopyColumn(); Column getDetailsColumn(); @@ -93,14 +108,16 @@ public interface Display extends WidgetDisplay } @Inject - public GlossaryPresenter(Display display, EventBus eventBus, CachingDispatchAsync dispatcher, GlossaryDetailsPresenter glossaryDetailsPresenter, DocumentListPresenter docListPresenter, History history, UserWorkspaceContext userWorkspaceContext) + public GlossaryPresenter(Display display, EventBus eventBus, CachingDispatchAsync dispatcher, final WebTransMessages messages, GlossaryDetailsPresenter glossaryDetailsPresenter, DocumentListPresenter docListPresenter, History history, UserWorkspaceContext userWorkspaceContext, KeyShortcutPresenter keyShortcutPresenter) { super(display, eventBus); this.dispatcher = dispatcher; this.userWorkspaceContext = userWorkspaceContext; this.glossaryDetailsPresenter = glossaryDetailsPresenter; this.docListPresenter = docListPresenter; + this.keyShortcutPresenter = keyShortcutPresenter; this.history = history; + this.messages = messages; dataProvider = new ListDataProvider(); display.setDataProvider(dataProvider); } @@ -113,11 +130,19 @@ protected void onBind() @Override public void onClick(ClickEvent event) { - String query = display.getGlossaryTextBox().getText(); - createGlossaryRequest(query, display.getSearchType().getValue()); + fireSearchEvent(); } }); + keyShortcutPresenter.register(new KeyShortcut(new Keys(Keys.NO_MODIFIER, KeyCodes.KEY_ENTER), ShortcutContext.Glossary, messages.searchGlossary(), new KeyShortcutEventHandler() + { + @Override + public void onKeyShortcut(KeyShortcutEvent event) + { + fireSearchEvent(); + } + })); + registerHandler(eventBus.addHandler(TransUnitSelectionEvent.getType(), new TransUnitSelectionHandler() { @Override @@ -144,12 +169,41 @@ public void update(int index, GlossaryResultItem object, ImageResource value) glossaryDetailsPresenter.show(object); } }); + + display.getFocusGlossaryTextBox().addFocusHandler(new FocusHandler() + { + @Override + public void onFocus(FocusEvent event) + { + keyShortcutPresenter.setContextActive(ShortcutContext.Glossary, true); + keyShortcutPresenter.setContextActive(ShortcutContext.Navigation, false); + keyShortcutPresenter.setContextActive(ShortcutContext.Edit, false); + isFocused = true; + } + }); + + display.getFocusGlossaryTextBox().addBlurHandler(new BlurHandler() + { + @Override + public void onBlur(BlurEvent event) + { + keyShortcutPresenter.setContextActive(ShortcutContext.Glossary, false); + keyShortcutPresenter.setContextActive(ShortcutContext.Navigation, true); + isFocused = false; + } + }); + } + + private void fireSearchEvent() + { + String query = display.getGlossaryTextBox().getText(); + createGlossaryRequest(query, display.getSearchType().getValue()); } private void createGlossaryRequest(final String query, GetGlossary.SearchType searchType) { display.startProcessing(); - + HistoryToken token = HistoryToken.fromTokenString(history.getToken()); DocumentId docId = docListPresenter.getDocumentId(token.getDocumentPath()); DocumentInfo docInfo = docListPresenter.getDocumentInfo(docId); @@ -165,7 +219,8 @@ private void createGlossaryRequest(final String query, GetGlossary.SearchType se public void createGlossaryRequestForTransUnit(TransUnit transUnit) { StringBuilder sources = new StringBuilder(); - for(String source: transUnit.getSources()){ + for (String source : transUnit.getSources()) + { sources.append(source); sources.append(" "); } @@ -247,4 +302,9 @@ protected void onUnbind() protected void onRevealDisplay() { } + + public boolean isFocused() + { + return isFocused; + } } 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 c3fdf626fe..320db9250e 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 @@ -303,6 +303,15 @@ private String getContextName(ShortcutContext context) case Navigation: contextName = messages.navigationScope(); break; + case TM: + contextName = messages.tmScope(); + break; + case Glossary: + contextName = messages.glossaryScope(); + break; + case Chat: + contextName = messages.chatScope(); + break; } return contextName; } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/TransMemoryPresenter.java b/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/TransMemoryPresenter.java index 576693cd8c..1e4c3e8fbf 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/TransMemoryPresenter.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/TransMemoryPresenter.java @@ -7,10 +7,16 @@ import net.customware.gwt.presenter.client.widget.WidgetPresenter; import org.zanata.webtrans.client.events.CopyDataToEditorEvent; +import org.zanata.webtrans.client.events.KeyShortcutEvent; +import org.zanata.webtrans.client.events.KeyShortcutEventHandler; import org.zanata.webtrans.client.events.TransMemoryShorcutCopyHandler; import org.zanata.webtrans.client.events.TransMemoryShortcutCopyEvent; import org.zanata.webtrans.client.events.TransUnitSelectionEvent; import org.zanata.webtrans.client.events.TransUnitSelectionHandler; +import org.zanata.webtrans.client.keys.KeyShortcut; +import org.zanata.webtrans.client.keys.Keys; +import org.zanata.webtrans.client.keys.ShortcutContext; +import org.zanata.webtrans.client.resources.WebTransMessages; import org.zanata.webtrans.client.rpc.CachingDispatchAsync; import org.zanata.webtrans.shared.model.TransMemoryQuery; import org.zanata.webtrans.shared.model.TransMemoryResultItem; @@ -22,9 +28,15 @@ import com.allen_sauer.gwt.log.client.Log; import com.google.gwt.cell.client.FieldUpdater; +import com.google.gwt.event.dom.client.BlurEvent; +import com.google.gwt.event.dom.client.BlurHandler; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.dom.client.FocusEvent; +import com.google.gwt.event.dom.client.FocusHandler; +import com.google.gwt.event.dom.client.HasAllFocusHandlers; import com.google.gwt.event.dom.client.HasClickHandlers; +import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.resources.client.ImageResource; import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.client.rpc.AsyncCallback; @@ -45,14 +57,14 @@ public interface Display extends WidgetDisplay HasText getTmTextBox(); + HasAllFocusHandlers getFocusTmTextBox(); + void startProcessing(); void stopProcessing(); void setPageSize(int size); - boolean isFocused(); - Column getDetailsColumn(); Column getCopyColumn(); @@ -62,26 +74,32 @@ public interface Display extends WidgetDisplay void setQueries(List queries); HasClickHandlers getMergeButton(); - } private final UserWorkspaceContext userWorkspaceContext; private final CachingDispatchAsync dispatcher; - + private GetTranslationMemory submittedRequest = null; private GetTranslationMemory lastRequest = null; private TransMemoryDetailsPresenter tmInfoPresenter; private TransMemoryMergePresenter transMemoryMergePresenter; + private KeyShortcutPresenter keyShortcutPresenter; private ListDataProvider dataProvider; + private final WebTransMessages messages; + + private boolean isFocused; + @Inject - public TransMemoryPresenter(Display display, EventBus eventBus, CachingDispatchAsync dispatcher, TransMemoryDetailsPresenter tmInfoPresenter, UserWorkspaceContext userWorkspaceContext, TransMemoryMergePresenter transMemoryMergePresenter) + public TransMemoryPresenter(Display display, EventBus eventBus, CachingDispatchAsync dispatcher, final WebTransMessages messages, TransMemoryDetailsPresenter tmInfoPresenter, UserWorkspaceContext userWorkspaceContext, TransMemoryMergePresenter transMemoryMergePresenter, KeyShortcutPresenter keyShortcutPresenter) { super(display, eventBus); this.dispatcher = dispatcher; this.userWorkspaceContext = userWorkspaceContext; this.tmInfoPresenter = tmInfoPresenter; this.transMemoryMergePresenter = transMemoryMergePresenter; + this.keyShortcutPresenter = keyShortcutPresenter; + this.messages = messages; dataProvider = new ListDataProvider(); display.setDataProvider(dataProvider); @@ -91,13 +109,22 @@ public TransMemoryPresenter(Display display, EventBus eventBus, CachingDispatchA protected void onBind() { display.getSearchType().setValue(SearchType.FUZZY); + + keyShortcutPresenter.register(new KeyShortcut(new Keys(Keys.NO_MODIFIER, KeyCodes.KEY_ENTER), ShortcutContext.TM, messages.searchTM(), new KeyShortcutEventHandler() + { + @Override + public void onKeyShortcut(KeyShortcutEvent event) + { + fireSearchEvent(); + } + })); + display.getSearchButton().addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { - String query = display.getTmTextBox().getText(); - createTMRequest(new TransMemoryQuery(query, display.getSearchType().getValue())); + fireSearchEvent(); } }); @@ -111,6 +138,29 @@ public void onClick(ClickEvent event) } }); + display.getFocusTmTextBox().addFocusHandler(new FocusHandler() + { + @Override + public void onFocus(FocusEvent event) + { + keyShortcutPresenter.setContextActive(ShortcutContext.TM, true); + keyShortcutPresenter.setContextActive(ShortcutContext.Navigation, false); + keyShortcutPresenter.setContextActive(ShortcutContext.Edit, false); + isFocused = true; + } + }); + + display.getFocusTmTextBox().addBlurHandler(new BlurHandler() + { + @Override + public void onBlur(BlurEvent event) + { + keyShortcutPresenter.setContextActive(ShortcutContext.TM, false); + keyShortcutPresenter.setContextActive(ShortcutContext.Navigation, true); + isFocused = false; + } + }); + registerHandler(eventBus.addHandler(TransUnitSelectionEvent.getType(), new TransUnitSelectionHandler() { @Override @@ -138,7 +188,7 @@ public void onTransMemoryCopy(TransMemoryShortcutCopyEvent event) } if (item != null) { - Log.debug("Copy from translation memory:" + (event.getIndex()+1)); + Log.debug("Copy from translation memory:" + (event.getIndex() + 1)); eventBus.fireEvent(new CopyDataToEditorEvent(item.getTargetContents())); } } @@ -173,6 +223,12 @@ public void onClick(ClickEvent event) }); } + private void fireSearchEvent() + { + String query = display.getTmTextBox().getText(); + createTMRequest(new TransMemoryQuery(query, display.getSearchType().getValue())); + } + public void createTMRequestForTransUnit(TransUnit transUnit) { // Start automatically fuzzy search @@ -189,10 +245,11 @@ private void createTMRequest(TransMemoryQuery query) } /** - * Create a translation memory request. The request will be sent - * immediately if the server is not processing another TM request, - * otherwise it will block. NB: If this request is blocked, it will be - * discarded if another request arrives before the server finishes. + * Create a translation memory request. The request will be sent immediately + * if the server is not processing another TM request, otherwise it will + * block. NB: If this request is blocked, it will be discarded if another + * request arrives before the server finishes. + * * @param action */ private void scheduleTMRequest(GetTranslationMemory action) @@ -267,4 +324,9 @@ public void onRevealDisplay() { } + public boolean isFocused() + { + return isFocused; + } + } 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 339f5da768..196c034c25 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 @@ -302,8 +302,8 @@ public void onKeyShortcut(KeyShortcutEvent event) private boolean isOtherInputFieldFocused() { return translationEditorPresenter.isTransFilterFocused() || - transMemoryPresenter.getDisplay().isFocused() || - glossaryPresenter.getDisplay().isFocused() || + transMemoryPresenter.isFocused() || + glossaryPresenter.isFocused() || translationEditorPresenter.getDisplay().isPagerFocused(); } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/WorkspaceUsersPresenter.java b/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/WorkspaceUsersPresenter.java index b22534f22e..14942f68d6 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/WorkspaceUsersPresenter.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/WorkspaceUsersPresenter.java @@ -6,8 +6,13 @@ import net.customware.gwt.presenter.client.widget.WidgetDisplay; import net.customware.gwt.presenter.client.widget.WidgetPresenter; +import org.zanata.webtrans.client.events.KeyShortcutEvent; +import org.zanata.webtrans.client.events.KeyShortcutEventHandler; import org.zanata.webtrans.client.events.PublishWorkspaceChatEvent; import org.zanata.webtrans.client.events.PublishWorkspaceChatEventHandler; +import org.zanata.webtrans.client.keys.KeyShortcut; +import org.zanata.webtrans.client.keys.Keys; +import org.zanata.webtrans.client.keys.ShortcutContext; import org.zanata.webtrans.client.resources.WebTransMessages; import org.zanata.webtrans.client.rpc.CachingDispatchAsync; import org.zanata.webtrans.client.service.UserSessionService; @@ -23,9 +28,15 @@ import org.zanata.webtrans.shared.rpc.PublishWorkspaceChatResult; import com.google.common.base.Strings; +import com.google.gwt.event.dom.client.BlurEvent; +import com.google.gwt.event.dom.client.BlurHandler; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.dom.client.FocusEvent; +import com.google.gwt.event.dom.client.FocusHandler; +import com.google.gwt.event.dom.client.HasAllFocusHandlers; import com.google.gwt.event.dom.client.HasClickHandlers; +import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.HasText; import com.google.inject.Inject; @@ -42,6 +53,8 @@ public class WorkspaceUsersPresenter extends WidgetPresenter() + if (!Strings.isNullOrEmpty(msg)) { - - @Override - public void onFailure(Throwable caught) + dispatcher.execute(new PublishWorkspaceChatAction(person, msg, messageType), new AsyncCallback() { - } - @Override - public void onSuccess(PublishWorkspaceChatResult result) - { - } - }); + @Override + public void onFailure(Throwable caught) + { + } + @Override + public void onSuccess(PublishWorkspaceChatResult result) + { + } + }); + display.getInputText().setText(""); + } } public void addTranslator(EditorClientId editorClientId, Person person, TransUnit selectedTransUnit) 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 f9df6b00a6..70ac97ef7e 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 @@ -313,6 +313,12 @@ public interface WebTransMessages extends Messages @DefaultMessage("Editor navigation") String navigationScope(); + + @DefaultMessage("Translation memory") + String tmScope(); + + @DefaultMessage("Glossary") + String glossaryScope(); @DefaultMessage("Toggle individual row action buttons (changes for next search)") String toggleRowActionButtons(); @@ -355,4 +361,13 @@ public interface WebTransMessages extends Messages @DefaultMessage("Close keyboard shortcuts list") String closeShortcutView(); + + @DefaultMessage("Search translation memory") + String searchTM(); + + @DefaultMessage("Search glossary") + String searchGlossary(); + + @DefaultMessage("Chat") + String chatScope(); } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/view/GlossaryView.java b/zanata-war/src/main/java/org/zanata/webtrans/client/view/GlossaryView.java index 839ac15bd0..e69b6f04ab 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/view/GlossaryView.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/view/GlossaryView.java @@ -12,9 +12,8 @@ import org.zanata.webtrans.shared.rpc.HasSearchType.SearchType; import com.google.gwt.core.client.GWT; -import com.google.gwt.event.dom.client.BlurEvent; import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.event.dom.client.FocusEvent; +import com.google.gwt.event.dom.client.HasAllFocusHandlers; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.dom.client.KeyUpEvent; import com.google.gwt.resources.client.ImageResource; @@ -68,7 +67,6 @@ interface GlossaryViewUiBinder extends UiBinder ScrollPanel scrollPanel; private final UiMessages messages; - private boolean isFocused; private final HighlightingLabelGlossaryColumn sourceColumn; private final HighlightingLabelGlossaryColumn targetColumn; @@ -102,19 +100,7 @@ void onGlossaryTextBoxKeyUp(KeyUpEvent event) searchButton.click(); } } - - @UiHandler("glossaryTextBox") - public void onGlossaryTextBoxFocus(FocusEvent event) - { - isFocused = true; - } - - @UiHandler("glossaryTextBox") - public void onGlossaryTextBoxBlur(BlurEvent event) - { - isFocused = false; - } - + @UiHandler("clearButton") void onClearButtonClicked(ClickEvent event) { @@ -145,18 +131,13 @@ public void startProcessing() dataProvider.getList().clear(); } - @Override - public boolean isFocused() - { - return isFocused; - } - @Override public HasValue getSearchType() { return searchType; } + public void renderTable() { glossaryTable = new CellTable(); @@ -207,4 +188,10 @@ public void setPageSize(int size) { glossaryTable.setPageSize(size); } + + @Override + public HasAllFocusHandlers getFocusGlossaryTextBox() + { + return glossaryTextBox; + } } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/view/TransMemoryView.java b/zanata-war/src/main/java/org/zanata/webtrans/client/view/TransMemoryView.java index d84f57eecb..463dae53ca 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/view/TransMemoryView.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/view/TransMemoryView.java @@ -6,7 +6,6 @@ import org.zanata.webtrans.client.resources.Resources; import org.zanata.webtrans.client.resources.UiMessages; import org.zanata.webtrans.client.ui.EnumListBox; -import org.zanata.webtrans.client.ui.TransMemoryMergePopupPanelDisplay; import org.zanata.webtrans.client.ui.SearchTypeRenderer; import org.zanata.webtrans.client.ui.table.column.CopyButtonColumn; import org.zanata.webtrans.client.ui.table.column.DetailsColumn; @@ -17,8 +16,6 @@ import org.zanata.webtrans.shared.rpc.HasSearchType.SearchType; import com.google.gwt.core.client.GWT; -import com.google.gwt.event.dom.client.BlurEvent; -import com.google.gwt.event.dom.client.FocusEvent; import com.google.gwt.event.dom.client.HasClickHandlers; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.dom.client.KeyUpEvent; @@ -74,8 +71,6 @@ interface TransMemoryViewUiBinder extends UiBinder CellTable tmTable; - private boolean isFocused; - private UiMessages messages; private ListDataProvider dataProvider; @@ -119,18 +114,6 @@ void onTmTextBoxKeyUp(KeyUpEvent event) } } - @UiHandler("tmTextBox") - public void onTmTextBoxFocus(FocusEvent event) - { - isFocused = true; - } - - @UiHandler("tmTextBox") - public void onTmTextBoxBlur(BlurEvent event) - { - isFocused = false; - } - @Override public HasClickHandlers getMergeButton() { @@ -185,12 +168,6 @@ public void setPageSize(int size) tmTable.setPageSize(size); } - @Override - public boolean isFocused() - { - return isFocused; - } - @Override public Column getDetailsColumn() { @@ -236,4 +213,10 @@ private void renderTable() scrollPanel.clear(); scrollPanel.add(tmTable); } + + @Override + public TextBox getFocusTmTextBox() + { + return tmTextBox; + } } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/view/WorkspaceUsersView.java b/zanata-war/src/main/java/org/zanata/webtrans/client/view/WorkspaceUsersView.java index ab6cf37238..0b87c49729 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/view/WorkspaceUsersView.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/view/WorkspaceUsersView.java @@ -9,6 +9,7 @@ import com.google.common.base.Strings; import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.HasAllFocusHandlers; import com.google.gwt.event.dom.client.HasClickHandlers; import com.google.gwt.resources.client.CssResource; import com.google.gwt.uibinder.client.UiBinder; @@ -145,4 +146,10 @@ else if (messageType == MESSAGE_TYPE.SYSTEM_WARNING) chatRoomScrollPanel.scrollToBottom(); } + + @Override + public HasAllFocusHandlers getFocusInputText() + { + return chatInput; + } } diff --git a/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/TransMemoryPresenterTest.java b/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/TransMemoryPresenterTest.java index 610727745f..4320637bb4 100644 --- a/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/TransMemoryPresenterTest.java +++ b/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/TransMemoryPresenterTest.java @@ -7,19 +7,19 @@ import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.expectLastCall; import static org.easymock.EasyMock.isA; -import static org.easymock.EasyMock.replay; -import static org.easymock.EasyMock.reset; -import static org.easymock.EasyMock.verify; import net.customware.gwt.presenter.client.EventBus; import org.easymock.Capture; +import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import org.zanata.webtrans.client.events.TransMemoryShorcutCopyHandler; import org.zanata.webtrans.client.events.TransMemoryShortcutCopyEvent; import org.zanata.webtrans.client.events.TransUnitSelectionEvent; import org.zanata.webtrans.client.events.TransUnitSelectionHandler; +import org.zanata.webtrans.client.keys.KeyShortcut; import org.zanata.webtrans.client.presenter.TransMemoryPresenter.Display; +import org.zanata.webtrans.client.resources.WebTransMessages; import org.zanata.webtrans.client.rpc.CachingDispatchAsync; import org.zanata.webtrans.shared.auth.Identity; import org.zanata.webtrans.shared.model.TransMemoryResultItem; @@ -27,7 +27,10 @@ import org.zanata.webtrans.shared.rpc.HasSearchType.SearchType; import com.google.gwt.cell.client.FieldUpdater; +import com.google.gwt.event.dom.client.BlurHandler; import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.dom.client.FocusHandler; +import com.google.gwt.event.dom.client.HasAllFocusHandlers; import com.google.gwt.event.dom.client.HasClickHandlers; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.resources.client.ImageResource; @@ -35,97 +38,117 @@ import com.google.gwt.user.client.ui.HasValue; import com.google.gwt.view.client.ListDataProvider; - @Test(groups = { "unit-tests" }) -public class TransMemoryPresenterTest +public class TransMemoryPresenterTest extends PresenterTest { // object under test TransMemoryPresenter transMemoryPresenter; - //injected mocks - Display mockDisplay = createMock(Display.class); - EventBus mockEventBus = createMock(EventBus.class); - Identity mockIdentity = createMock(Identity.class); - UserWorkspaceContext mockUserWorkspaceContext = createMock(UserWorkspaceContext.class); - - CachingDispatchAsync mockDispatcher = createMock(CachingDispatchAsync.class); - TransMemoryDetailsPresenter mockTransMemoryDetailsPresenter = createMock(TransMemoryDetailsPresenter.class); - - @SuppressWarnings("unchecked") - HasValue mockSearchType = createMock(HasValue.class); - HasClickHandlers mockSearchButton = createMock(HasClickHandlers.class); - @SuppressWarnings("unchecked") - Column mockDetailsColumn = createMock(Column.class); - @SuppressWarnings("unchecked") - Column mockCopyColumn = createMock(Column.class); - - Capture capturedTransUnitSelectionEventHandler = new Capture(); - Capture capturedClearButtonClickHandler = new Capture(); - Capture capturedSearchButtonClickHandler = new Capture(); - Capture capturedTransMemoryShortcutCopyEventHandler = new Capture(); - - HasClickHandlers mockClearButton = createMock(HasClickHandlers.class); - TransMemoryMergePresenter mockTransMemoryMergePresenter = createMock(TransMemoryMergePresenter.class); - + // injected mocks + Display mockDisplay; + EventBus mockEventBus; + Identity mockIdentity; + UserWorkspaceContext mockUserWorkspaceContext; + CachingDispatchAsync mockDispatcher; + TransMemoryDetailsPresenter mockTransMemoryDetailsPresenter; + WebTransMessages mockMessages; + KeyShortcutPresenter mockKeyShortcutPresenter; + TransMemoryMergePresenter mockTransMemoryMergePresenter; + + HasAllFocusHandlers mockFocusTextBox; + HasValue mockSearchType; + HasClickHandlers mockSearchButton; + Column mockDetailsColumn; + Column mockCopyColumn; + HasClickHandlers mockClearButton; + + private Capture capturedTransUnitSelectionEventHandler; + private Capture capturedFocusHandler; + private Capture capturedBlurHandler; + private Capture capturedClearButtonClickHandler; + private Capture capturedSearchButtonClickHandler; + private Capture capturedTransMemoryShortcutCopyEventHandler; + private Capture capturedKeyShortcuts; + + @BeforeClass + public void createMocks() + { + mockDisplay = createAndAddMock(Display.class); + mockEventBus = createAndAddMock(EventBus.class); + mockIdentity = createAndAddMock(Identity.class); + mockUserWorkspaceContext = createAndAddMock(UserWorkspaceContext.class); + mockDispatcher = createAndAddMock(CachingDispatchAsync.class); + mockTransMemoryDetailsPresenter = createAndAddMock(TransMemoryDetailsPresenter.class); + mockMessages = createAndAddMock(WebTransMessages.class); + mockKeyShortcutPresenter = createAndAddMock(KeyShortcutPresenter.class); + mockTransMemoryMergePresenter = createAndAddMock(TransMemoryMergePresenter.class); + + mockFocusTextBox = createAndAddMock(HasAllFocusHandlers.class); + mockClearButton = createAndAddMock(HasClickHandlers.class); + mockSearchType = createAndAddMock(HasValue.class); + mockSearchButton = createAndAddMock(HasClickHandlers.class); + mockDetailsColumn = createAndAddMock(Column.class); + mockCopyColumn = createAndAddMock(Column.class); + + capturedTransUnitSelectionEventHandler = addCapture(new Capture()); + capturedFocusHandler = addCapture(new Capture()); + capturedBlurHandler = addCapture(new Capture()); + capturedClearButtonClickHandler = addCapture(new Capture()); + capturedSearchButtonClickHandler = addCapture(new Capture()); + capturedTransMemoryShortcutCopyEventHandler = addCapture(new Capture()); + capturedKeyShortcuts = addCapture(new Capture()); + } @BeforeMethod - public void resetMocks() + public void beforeMethod() { - reset(mockDispatcher, mockDisplay, mockEventBus, mockIdentity, mockTransMemoryDetailsPresenter, mockUserWorkspaceContext); - reset(mockSearchType, mockSearchButton, mockClearButton); - reset(mockDetailsColumn, mockCopyColumn); - - capturedTransUnitSelectionEventHandler.reset(); - capturedSearchButtonClickHandler.reset(); - capturedTransMemoryShortcutCopyEventHandler.reset(); + resetAll(); } - @SuppressWarnings("unchecked") + @Test public void canBind() { + replayAllMocks(); + transMemoryPresenter = new TransMemoryPresenter(mockDisplay, mockEventBus, mockDispatcher, mockMessages, mockTransMemoryDetailsPresenter, mockUserWorkspaceContext, mockTransMemoryMergePresenter, mockKeyShortcutPresenter); + transMemoryPresenter.bind(); + verifyAllMocks(); + } + + @Override + protected void setDefaultBindExpectations() + { + mockDisplay.setDataProvider(isA(ListDataProvider.class)); + expectLastCall().once(); + expect(mockDisplay.getSearchType()).andReturn(mockSearchType).anyTimes(); mockSearchType.setValue(SearchType.FUZZY); expectLastCall().once(); + expect(mockMessages.searchTM()).andReturn("Search TM"); + expect(mockKeyShortcutPresenter.register(and(capture(capturedKeyShortcuts), isA(KeyShortcut.class)))).andReturn(null).once(); + expect(mockDisplay.getSearchButton()).andReturn(mockSearchButton).anyTimes(); expect(mockSearchButton.addClickHandler(capture(capturedSearchButtonClickHandler))).andReturn(createMock(HandlerRegistration.class)).once(); expect(mockDisplay.getClearButton()).andReturn(mockClearButton).anyTimes(); expect(mockClearButton.addClickHandler(capture(capturedClearButtonClickHandler))).andReturn(createMock(HandlerRegistration.class)).once(); - expect(mockEventBus.addHandler(eq(TransUnitSelectionEvent.getType()), and(capture(capturedTransUnitSelectionEventHandler), isA(TransUnitSelectionHandler.class)))).andReturn(createMock(HandlerRegistration.class)).once(); - expect(mockEventBus.addHandler(eq(TransMemoryShortcutCopyEvent.getType()), and(capture(capturedTransMemoryShortcutCopyEventHandler ), isA(TransMemoryShorcutCopyHandler.class)))).andReturn(createMock(HandlerRegistration.class)).once(); - - expect(mockDisplay.getDetailsColumn()).andReturn(mockDetailsColumn).anyTimes(); - - expect(mockDisplay.getMergeButton()).andReturn(createMock(HasClickHandlers.class)).once(); + expect(mockDisplay.getFocusTmTextBox()).andReturn(mockFocusTextBox).times(2); + expect(mockFocusTextBox.addFocusHandler(capture(capturedFocusHandler))).andReturn(createMock(HandlerRegistration.class)).once(); + expect(mockFocusTextBox.addBlurHandler(capture(capturedBlurHandler))).andReturn(createMock(HandlerRegistration.class)).once(); - //TODO capture field updaters and data provider to check them? + expect(mockEventBus.addHandler(eq(TransUnitSelectionEvent.getType()), and(capture(capturedTransUnitSelectionEventHandler), isA(TransUnitSelectionHandler.class)))).andReturn(createMock(HandlerRegistration.class)).once(); + expect(mockEventBus.addHandler(eq(TransMemoryShortcutCopyEvent.getType()), and(capture(capturedTransMemoryShortcutCopyEventHandler), isA(TransMemoryShorcutCopyHandler.class)))).andReturn(createMock(HandlerRegistration.class)).once(); + expect(mockDisplay.getDetailsColumn()).andReturn(mockDetailsColumn).once(); mockDetailsColumn.setFieldUpdater(isA(FieldUpdater.class)); expectLastCall().once(); - expect(mockDisplay.getCopyColumn()).andReturn(mockCopyColumn).anyTimes(); - + expect(mockDisplay.getCopyColumn()).andReturn(mockCopyColumn).once(); mockCopyColumn.setFieldUpdater(isA(FieldUpdater.class)); expectLastCall().once(); - //multiple calls may be bad (rendering issues?). May want to inject into - //view and presenter instead. - mockDisplay.setDataProvider(isA(ListDataProvider.class)); - expectLastCall().once(); - - replay(mockDispatcher, mockDisplay, mockEventBus, mockIdentity, mockTransMemoryDetailsPresenter, mockUserWorkspaceContext); - replay(mockSearchType, mockSearchButton, mockClearButton); - replay(mockDetailsColumn, mockCopyColumn); - - transMemoryPresenter = new TransMemoryPresenter(mockDisplay, mockEventBus, mockDispatcher, mockTransMemoryDetailsPresenter, mockUserWorkspaceContext, mockTransMemoryMergePresenter); - - transMemoryPresenter.bind(); - - verify(mockDispatcher, mockDisplay, mockEventBus, mockIdentity, mockTransMemoryDetailsPresenter, mockUserWorkspaceContext); - verify(mockSearchType, mockSearchButton, mockClearButton); - verify(mockDetailsColumn, mockCopyColumn); + expect(mockDisplay.getMergeButton()).andReturn(createMock(HasClickHandlers.class)).once(); } } diff --git a/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/WorkspaceUsersPresenterTest.java b/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/WorkspaceUsersPresenterTest.java index 18552a9500..313e6ef05d 100644 --- a/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/WorkspaceUsersPresenterTest.java +++ b/zanata-war/src/test/java/org/zanata/webtrans/client/presenter/WorkspaceUsersPresenterTest.java @@ -1,14 +1,12 @@ package org.zanata.webtrans.client.presenter; +import static org.easymock.EasyMock.and; import static org.easymock.EasyMock.capture; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.eq; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.expectLastCall; import static org.easymock.EasyMock.isA; -import static org.easymock.EasyMock.replay; -import static org.easymock.EasyMock.reset; -import static org.easymock.EasyMock.verify; import java.util.HashMap; import java.util.Map; @@ -16,10 +14,12 @@ import net.customware.gwt.presenter.client.EventBus; import org.easymock.Capture; +import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import org.zanata.webtrans.client.events.PublishWorkspaceChatEvent; import org.zanata.webtrans.client.events.PublishWorkspaceChatEventHandler; +import org.zanata.webtrans.client.keys.KeyShortcut; import org.zanata.webtrans.client.presenter.WorkspaceUsersPresenter.Display; import org.zanata.webtrans.client.resources.WebTransMessages; import org.zanata.webtrans.client.rpc.CachingDispatchAsync; @@ -33,56 +33,72 @@ import org.zanata.webtrans.shared.model.UserPanelSessionItem; import org.zanata.webtrans.shared.rpc.HasWorkspaceChatData.MESSAGE_TYPE; +import com.google.gwt.event.dom.client.BlurHandler; import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.dom.client.FocusHandler; +import com.google.gwt.event.dom.client.HasAllFocusHandlers; import com.google.gwt.event.dom.client.HasClickHandlers; import com.google.gwt.event.shared.HandlerRegistration; - @Test(groups = { "unit-tests" }) -public class WorkspaceUsersPresenterTest +public class WorkspaceUsersPresenterTest extends PresenterTest { + private final static String PUBLIC_CHANNEL_WARN = "Warning! This is a public channel"; + // object under test WorkspaceUsersPresenter workspaceUsersPresenter; - //injected mocks - Display mockDisplay = createMock(Display.class); - EventBus mockEventBus = createMock(EventBus.class); - - Identity mockIdentity = createMock(Identity.class); - CachingDispatchAsync mockDispatcher = createMock(CachingDispatchAsync.class); - HasClickHandlers mockSendButton = createMock(HasClickHandlers.class); - WebTransMessages mockMessages = createMock(WebTransMessages.class); + // injected mocks + Display mockDisplay; + EventBus mockEventBus; - Capture capturedSendButtonClickHandler = new Capture(); + Identity mockIdentity; + CachingDispatchAsync mockDispatcher; + HasClickHandlers mockSendButton; + WebTransMessages mockMessages; + UserSessionService mockSessionService; + KeyShortcutPresenter mockKeyShortcutPresenter; - UserSessionService mockSessionService = createMock(UserSessionService.class); + HasAllFocusHandlers mockFocusTextBox; - private final static String PUBLIC_CHANNEL_WARN = "Warning! This is a public channel"; + private Capture capturedSendButtonClickHandler; + private Capture capturedKeyShortcuts; + private Capture capturedFocusHandler; + private Capture capturedBlurHandler; + + @BeforeClass + public void createMocks() + { + mockDisplay = createAndAddMock(Display.class); + mockEventBus = createAndAddMock(EventBus.class); + + mockIdentity = createAndAddMock(Identity.class); + mockDispatcher = createAndAddMock(CachingDispatchAsync.class); + mockSendButton = createAndAddMock(HasClickHandlers.class); + mockMessages = createAndAddMock(WebTransMessages.class); + mockSessionService = createAndAddMock(UserSessionService.class); + mockKeyShortcutPresenter = createAndAddMock(KeyShortcutPresenter.class); + mockFocusTextBox = createAndAddMock(HasAllFocusHandlers.class); + + capturedSendButtonClickHandler = addCapture(new Capture()); + capturedKeyShortcuts = addCapture(new Capture()); + capturedFocusHandler = addCapture(new Capture()); + capturedBlurHandler = addCapture(new Capture()); + } @BeforeMethod - public void resetMocks() + public void beforeMethod() { - reset(mockDisplay, mockEventBus, mockSendButton, mockSessionService, mockMessages, mockDispatcher, mockIdentity); - workspaceUsersPresenter = new WorkspaceUsersPresenter(mockDisplay, mockEventBus, mockIdentity, mockDispatcher, mockMessages, mockSessionService); + resetAll(); + workspaceUsersPresenter = new WorkspaceUsersPresenter(mockDisplay, mockEventBus, mockIdentity, mockDispatcher, mockMessages, mockSessionService, mockKeyShortcutPresenter); } public void setEmptyUserList() { - expect(mockDisplay.getSendButton()).andReturn(mockSendButton); - expect(mockSendButton.addClickHandler(capture(capturedSendButtonClickHandler))).andReturn(createMock(HandlerRegistration.class)); - - expect(mockMessages.thisIsAPublicChannel()).andReturn(PUBLIC_CHANNEL_WARN); - - mockDisplay.appendChat(null, null, PUBLIC_CHANNEL_WARN, MESSAGE_TYPE.SYSTEM_WARNING); - expectLastCall().once(); - - expect(mockEventBus.addHandler(eq(PublishWorkspaceChatEvent.getType()), isA(PublishWorkspaceChatEventHandler.class))).andReturn(createMock(HandlerRegistration.class)); - replayAll(); - + replayAllMocks(); workspaceUsersPresenter.bind(); workspaceUsersPresenter.initUserList(new HashMap()); - - verifyAll(); + verifyAllMocks(); } public void setNonEmptyUserList() @@ -90,7 +106,7 @@ public void setNonEmptyUserList() Person person1 = new Person(new PersonId("person1"), "John Smith", "http://www.gravatar.com/avatar/john@zanata.org?d=mm&s=16"); Person person2 = new Person(new PersonId("person2"), "Smith John", "http://www.gravatar.com/avatar/smith@zanata.org?d=mm&s=16"); Person person3 = new Person(new PersonId("person3"), "Smohn Jith", "http://www.gravatar.com/avatar/smohn@zanata.org?d=mm&s=16"); - + EditorClientId editorClientId1 = new EditorClientId("sessionId1", 1); EditorClientId editorClientId2 = new EditorClientId("sessionId2", 1); EditorClientId editorClientId3 = new EditorClientId("sessionId3", 1); @@ -103,11 +119,6 @@ public void setNonEmptyUserList() UserPanelSessionItem mockItem2 = new UserPanelSessionItem(mockPanel2, person2); UserPanelSessionItem mockItem3 = new UserPanelSessionItem(mockPanel3, person3); - expect(mockMessages.thisIsAPublicChannel()).andReturn(PUBLIC_CHANNEL_WARN); - - mockDisplay.appendChat(null, null, PUBLIC_CHANNEL_WARN, MESSAGE_TYPE.SYSTEM_WARNING); - expectLastCall().once(); - expect(mockSessionService.getColor(editorClientId1.getValue())).andReturn("color1"); expect(mockSessionService.getColor(editorClientId2.getValue())).andReturn("color2"); expect(mockSessionService.getColor(editorClientId3.getValue())).andReturn("color3"); @@ -115,7 +126,7 @@ public void setNonEmptyUserList() expect(mockSessionService.getUserPanel(editorClientId1)).andReturn(mockItem1); expect(mockSessionService.getUserPanel(editorClientId2)).andReturn(mockItem2); expect(mockSessionService.getUserPanel(editorClientId3)).andReturn(mockItem3); - + mockSessionService.updateTranslatorStatus(editorClientId1, null); expectLastCall().once(); @@ -125,12 +136,7 @@ public void setNonEmptyUserList() mockSessionService.updateTranslatorStatus(editorClientId3, null); expectLastCall().once(); - expect(mockDisplay.getSendButton()).andReturn(mockSendButton); - expect(mockSendButton.addClickHandler(capture(capturedSendButtonClickHandler))).andReturn(createMock(HandlerRegistration.class)); - - expect(mockEventBus.addHandler(eq(PublishWorkspaceChatEvent.getType()), isA(PublishWorkspaceChatEventHandler.class))).andReturn(createMock(HandlerRegistration.class)); - replayAll(); - + replayAllMocks(); workspaceUsersPresenter.bind(); Map people = new HashMap(); @@ -139,16 +145,28 @@ public void setNonEmptyUserList() people.put(editorClientId3, new PersonSessionDetails(person3, null)); workspaceUsersPresenter.initUserList(people); - verifyAll(); - } - - private void verifyAll() - { - verify(mockDisplay, mockEventBus, mockSendButton, mockSessionService, mockMessages, mockIdentity, mockDispatcher); + verifyAllMocks(); } - private void replayAll() + @Override + protected void setDefaultBindExpectations() { - replay(mockDisplay, mockEventBus, mockSendButton, mockSessionService, mockMessages, mockIdentity, mockDispatcher); + expect(mockEventBus.addHandler(eq(PublishWorkspaceChatEvent.getType()), isA(PublishWorkspaceChatEventHandler.class))).andReturn(createMock(HandlerRegistration.class)); + + expect(mockDisplay.getSendButton()).andReturn(mockSendButton); + expect(mockSendButton.addClickHandler(capture(capturedSendButtonClickHandler))).andReturn(createMock(HandlerRegistration.class)); + + expect(mockMessages.thisIsAPublicChannel()).andReturn(PUBLIC_CHANNEL_WARN); + expect(mockMessages.searchGlossary()).andReturn("Glossary"); + + mockDisplay.appendChat(null, null, PUBLIC_CHANNEL_WARN, MESSAGE_TYPE.SYSTEM_WARNING); + expectLastCall().once(); + + expect(mockKeyShortcutPresenter.register(and(capture(capturedKeyShortcuts), isA(KeyShortcut.class)))).andReturn(null).once(); + + expect(mockDisplay.getFocusInputText()).andReturn(mockFocusTextBox).times(2); + expect(mockFocusTextBox.addFocusHandler(capture(capturedFocusHandler))).andReturn(createMock(HandlerRegistration.class)).once(); + expect(mockFocusTextBox.addBlurHandler(capture(capturedBlurHandler))).andReturn(createMock(HandlerRegistration.class)).once(); + } }