diff --git a/server/zanata-war/eclipse/launch/webtrans-dummy.launch b/server/zanata-war/eclipse/launch/webtrans-dummy.launch index a0085ada49..0ca90fb387 100644 --- a/server/zanata-war/eclipse/launch/webtrans-dummy.launch +++ b/server/zanata-war/eclipse/launch/webtrans-dummy.launch @@ -20,7 +20,7 @@ - + diff --git a/server/zanata-war/eclipse/launch/webtrans-jboss.launch b/server/zanata-war/eclipse/launch/webtrans-jboss.launch index 58f5868ad6..841e5fbb4d 100644 --- a/server/zanata-war/eclipse/launch/webtrans-jboss.launch +++ b/server/zanata-war/eclipse/launch/webtrans-jboss.launch @@ -21,7 +21,7 @@ - + diff --git a/server/zanata-war/src/main/java/org/zanata/webtrans/client/Resources.java b/server/zanata-war/src/main/java/org/zanata/webtrans/client/Resources.java index 32a7f12c86..7336ad34f7 100644 --- a/server/zanata-war/src/main/java/org/zanata/webtrans/client/Resources.java +++ b/server/zanata-war/src/main/java/org/zanata/webtrans/client/Resources.java @@ -45,6 +45,9 @@ public interface Resources extends ClientBundle @Source("org/zanata/webtrans/images/crystal_project/_16x16/actions/rightArrow.png") ImageResource rightArrowButton(); + @Source("org/zanata/webtrans/images/crystal_project/_16x16/actions/configure.png") + ImageResource configureButton(); + @Source("org/zanata/webtrans/images/banner_bg.png") DataResource bannerBackground(); diff --git a/server/zanata-war/src/main/java/org/zanata/webtrans/client/TransUnitNavigationPresenter.java b/server/zanata-war/src/main/java/org/zanata/webtrans/client/TransUnitNavigationPresenter.java index 93397358f5..495a81b4b9 100644 --- a/server/zanata-war/src/main/java/org/zanata/webtrans/client/TransUnitNavigationPresenter.java +++ b/server/zanata-war/src/main/java/org/zanata/webtrans/client/TransUnitNavigationPresenter.java @@ -20,19 +20,25 @@ */ package org.zanata.webtrans.client; +import java.util.Map; + import net.customware.gwt.presenter.client.EventBus; import net.customware.gwt.presenter.client.widget.WidgetDisplay; import net.customware.gwt.presenter.client.widget.WidgetPresenter; +import org.zanata.common.ContentState; +import org.zanata.webtrans.client.editor.table.TableConstants; import org.zanata.webtrans.client.events.NavTransUnitEvent; import org.zanata.webtrans.client.events.NavTransUnitEvent.NavigationType; import org.zanata.webtrans.client.events.NavTransUnitHandler; +import org.zanata.webtrans.client.ui.ShortcutConfigPanel; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.HasClickHandlers; import com.google.gwt.event.shared.GwtEvent; import com.google.gwt.event.shared.HandlerRegistration; +import com.google.gwt.user.client.ui.Widget; import com.google.inject.Inject; public class TransUnitNavigationPresenter extends WidgetPresenter implements HasNavTransUnitHandlers @@ -47,6 +53,12 @@ public interface Display extends WidgetDisplay HasClickHandlers getPrevFuzzyOrUntranslatedButton(); HasClickHandlers getNextFuzzyOrUntranslatedButton(); + + HasClickHandlers getConfigureButton(); + + Widget getConfigureButtonObject(); + + void setNavModeTooltip(Map configMap); } @Inject @@ -55,6 +67,8 @@ public TransUnitNavigationPresenter(Display display, EventBus eventBus) super(display, eventBus); } + final ShortcutConfigPanel shortcutConfigPanel = new ShortcutConfigPanel(true, eventBus); + @Override protected void onBind() { @@ -94,6 +108,15 @@ public void onClick(ClickEvent event) } }); + display.getConfigureButton().addClickHandler(new ClickHandler() + { + @Override + public void onClick(ClickEvent event) + { + shortcutConfigPanel.toggleDisplay(display.getConfigureButtonObject()); + } + }); + } @Override diff --git a/server/zanata-war/src/main/java/org/zanata/webtrans/client/TransUnitNavigationView.java b/server/zanata-war/src/main/java/org/zanata/webtrans/client/TransUnitNavigationView.java index 44e60b03cc..a6fdcdd046 100644 --- a/server/zanata-war/src/main/java/org/zanata/webtrans/client/TransUnitNavigationView.java +++ b/server/zanata-war/src/main/java/org/zanata/webtrans/client/TransUnitNavigationView.java @@ -20,6 +20,9 @@ */ package org.zanata.webtrans.client; +import java.util.Map; + +import org.zanata.common.ContentState; import org.zanata.webtrans.client.editor.table.NavigationMessages; import com.google.gwt.core.client.GWT; @@ -41,7 +44,7 @@ interface TransUnitNavigationViewUiBinder extends UiBinder configMap) + { + boolean isFuzzy = configMap.get(ContentState.NeedReview); + boolean isUntranslated = configMap.get(ContentState.New); + + if (isFuzzy && !isUntranslated) + { + setFuzzyModeTooltip(); + } + else if (isUntranslated && !isFuzzy) + { + setUntranslatedModeTooltip(); + } + else + { + setFuzzyAndUntranslatedModeTooltip(); + } + } + + private void setFuzzyModeTooltip() + { + prevFuzzyOrUntranslated.setTitle(messages.actionToolTip(messages.prevFuzzy(), messages.prevFuzzyOrUntranslatedShortcut())); + nextFuzzyOrUntranslated.setTitle(messages.actionToolTip(messages.nextFuzzy(), messages.nextFuzzyOrUntranslatedShortcut())); + } + + private void setUntranslatedModeTooltip() + { + prevFuzzyOrUntranslated.setTitle(messages.actionToolTip(messages.prevUntranslated(), messages.prevFuzzyOrUntranslatedShortcut())); + nextFuzzyOrUntranslated.setTitle(messages.actionToolTip(messages.nextUntranslated(), messages.nextFuzzyOrUntranslatedShortcut())); + } + + private void setFuzzyAndUntranslatedModeTooltip() + { prevFuzzyOrUntranslated.setTitle(messages.actionToolTip(messages.prevFuzzyOrUntranslated(), messages.prevFuzzyOrUntranslatedShortcut())); nextFuzzyOrUntranslated.setTitle(messages.actionToolTip(messages.nextFuzzyOrUntranslated(), messages.nextFuzzyOrUntranslatedShortcut())); } @@ -92,4 +132,16 @@ public Widget asWidget() return this; } + @Override + public HasClickHandlers getConfigureButton() + { + return configure; + } + + @Override + public Widget getConfigureButtonObject() + { + return configure; + } + } diff --git a/server/zanata-war/src/main/java/org/zanata/webtrans/client/TransUnitNavigationView.ui.xml b/server/zanata-war/src/main/java/org/zanata/webtrans/client/TransUnitNavigationView.ui.xml index a1cdd39cb6..38581da1bc 100644 --- a/server/zanata-war/src/main/java/org/zanata/webtrans/client/TransUnitNavigationView.ui.xml +++ b/server/zanata-war/src/main/java/org/zanata/webtrans/client/TransUnitNavigationView.ui.xml @@ -11,6 +11,7 @@ + diff --git a/server/zanata-war/src/main/java/org/zanata/webtrans/client/TranslationEditorPresenter.java b/server/zanata-war/src/main/java/org/zanata/webtrans/client/TranslationEditorPresenter.java index 8b85bfacec..f7040579b8 100644 --- a/server/zanata-war/src/main/java/org/zanata/webtrans/client/TranslationEditorPresenter.java +++ b/server/zanata-war/src/main/java/org/zanata/webtrans/client/TranslationEditorPresenter.java @@ -32,10 +32,13 @@ import org.zanata.webtrans.client.editor.table.TableEditorPresenter; import org.zanata.webtrans.client.events.DocumentSelectionEvent; import org.zanata.webtrans.client.events.DocumentSelectionHandler; +import org.zanata.webtrans.client.events.NavConfigChangeEvent; +import org.zanata.webtrans.client.events.NavConfigChangeHandler; import org.zanata.webtrans.client.events.TransUnitUpdatedEvent; import org.zanata.webtrans.client.events.TransUnitUpdatedEventHandler; import org.zanata.webtrans.client.rpc.CachingDispatchAsync; import org.zanata.webtrans.client.ui.HasPager; +import org.zanata.webtrans.client.ui.ShortcutConfigPanel; import org.zanata.webtrans.shared.model.DocumentId; import org.zanata.webtrans.shared.model.DocumentInfo; import org.zanata.webtrans.shared.model.TransUnit; @@ -150,6 +153,16 @@ public void onDocumentSelected(DocumentSelectionEvent event) } })); registerHandler(eventBus.addHandler(TransUnitUpdatedEvent.getType(), updateHandler)); + + registerHandler(eventBus.addHandler(NavConfigChangeEvent.getType(), new NavConfigChangeHandler() + { + @Override + public void onValueChanged(NavConfigChangeEvent event) + { + transUnitNavigationPresenter.getDisplay().setNavModeTooltip(event.getConfigMap()); + tableEditorPresenter.getDisplay().getTargetCellEditor().setNavMode(event.getConfigMap()); + } + })); } private void requestStatusCount(final DocumentId newDocumentId) diff --git a/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/EditRowCallback.java b/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/EditRowCallback.java index 73efab6337..e75ebf93c2 100644 --- a/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/EditRowCallback.java +++ b/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/EditRowCallback.java @@ -7,7 +7,15 @@ public interface EditRowCallback void gotoPrevRow(int row); - void gotoNextFuzzy(int row); + void gotoNextFuzzyNewRow(int row); - void gotoPrevFuzzy(int row); + void gotoPrevFuzzyNewRow(int row); + + void gotoNextFuzzyRow(int row); + + void gotoPrevFuzzyRow(int row); + + void gotoNextNewRow(int row); + + void gotoPrevNewRow(int row); } diff --git a/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/InlineTargetCellEditor.java b/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/InlineTargetCellEditor.java index 5258e87f46..234c403451 100644 --- a/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/InlineTargetCellEditor.java +++ b/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/InlineTargetCellEditor.java @@ -20,6 +20,8 @@ */ package org.zanata.webtrans.client.editor.table; +import java.util.Map; + import net.customware.gwt.presenter.client.EventBus; import org.zanata.common.ContentState; @@ -255,12 +257,12 @@ else if (event.isAltKeyDown() && (event.isUpArrow() || keyCode == TableConstants else if (event.isAltKeyDown() && keyCode == KeyCodes.KEY_PAGEDOWN) { // alt-pagedown - saveAndMoveNextFuzzy(NavigationType.NextEntry); + saveAndMoveNextState(NavigationType.NextEntry); } else if (event.isAltKeyDown() && keyCode == KeyCodes.KEY_PAGEUP) { // alt-pageup - saveAndMoveNextFuzzy(NavigationType.PrevEntry); + saveAndMoveNextState(NavigationType.PrevEntry); } else if (!event.isAltKeyDown() && !event.isControlKeyDown()) { @@ -311,7 +313,7 @@ else if (!event.isAltKeyDown() && !event.isControlKeyDown()) Image fuzzyButton = new Image(images.cellEditorFuzzy()); fuzzyButton.setStyleName("gwt-Button"); - fuzzyButton.setTitle(messages.fuzzy()); + fuzzyButton.setTitle(messages.saveAsFuzzy()); fuzzyButton.addClickHandler(fuzzyHandler); operationsPanel.add(saveButton); @@ -332,15 +334,39 @@ else if (nav == NavigationType.PrevEntry) } } + private void gotoNewRow(NavigationType nav) + { + if (nav == NavigationType.NextEntry) + { + editRowCallback.gotoNextNewRow(curRow); + } + else if (nav == NavigationType.PrevEntry) + { + editRowCallback.gotoPrevNewRow(curRow); + } + } + + private void gotoFuzzyAndNewRow(NavigationType nav) + { + if (nav == NavigationType.NextEntry) + { + editRowCallback.gotoNextFuzzyNewRow(curRow); + } + else if (nav == NavigationType.PrevEntry) + { + editRowCallback.gotoPrevFuzzyNewRow(curRow); + } + } + private void gotoFuzzyRow(NavigationType nav) { if (nav == NavigationType.NextEntry) { - editRowCallback.gotoNextFuzzy(curRow); + editRowCallback.gotoNextFuzzyRow(curRow); } else if (nav == NavigationType.PrevEntry) { - editRowCallback.gotoPrevFuzzy(curRow); + editRowCallback.gotoPrevFuzzyRow(curRow); } } @@ -440,10 +466,24 @@ public void savePendingChange(boolean cancelIfUnchanged) } } - public void saveAndMoveNextFuzzy(NavigationType nav) + private boolean newMode = true, fuzzyMode = true; + + public void saveAndMoveNextState(NavigationType nav) { savePendingChange(true); - gotoFuzzyRow(nav); + + if (newMode && fuzzyMode) + { + gotoFuzzyAndNewRow(nav); + } + else if (newMode) + { + gotoNewRow(nav); + } + else if (fuzzyMode) + { + gotoFuzzyRow(nav); + } } /** @@ -569,4 +609,10 @@ public void autoSize() textArea.setVisibleLines(textArea.getVisibleLines() + growByLines); } } + + public void setNavMode(Map configMap) + { + newMode = configMap.get(ContentState.New); + fuzzyMode = configMap.get(ContentState.NeedReview); + } } diff --git a/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/NavigationCacheCallback.java b/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/NavigationCacheCallback.java index cbdad0c34a..1408822e91 100644 --- a/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/NavigationCacheCallback.java +++ b/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/NavigationCacheCallback.java @@ -23,7 +23,7 @@ public interface NavigationCacheCallback { - void nextFuzzy(); + void next(boolean isNewState, boolean isFuzzyState); - void prevFuzzy(); + void prev(boolean isNewState, boolean isFuzzyState); } diff --git a/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/NavigationMessages.java b/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/NavigationMessages.java index 5a4da211d4..d0f8b0cb7b 100644 --- a/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/NavigationMessages.java +++ b/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/NavigationMessages.java @@ -44,6 +44,15 @@ public interface NavigationMessages extends Messages @DefaultMessage("Next Fuzzy") String nextFuzzy(); + @DefaultMessage("Prev Fuzzy") + String prevFuzzy(); + + @DefaultMessage("Next Untranslated") + String nextUntranslated(); + + @DefaultMessage("Prev Untranslated") + String prevUntranslated(); + @DefaultMessage("Next Fuzzy or Untranslated") String nextFuzzyOrUntranslated(); @@ -62,6 +71,9 @@ public interface NavigationMessages extends Messages @DefaultMessage("Cancel") String editCancelShortcut(); + @DefaultMessage("Configure navigation shortcut key") + String configurationButton(); + // @DefaultMessage("Copy") // String editClone(); @@ -83,7 +95,7 @@ public interface NavigationMessages extends Messages String actionToolTip(String actionName, String shortcut); @DefaultMessage("Save as Fuzzy (Ctrl+S)") - String fuzzy(); + String saveAsFuzzy(); @DefaultMessage("Source comment: ") String sourceCommentLabel(); diff --git a/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/RedirectingCachedTableModel.java b/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/RedirectingCachedTableModel.java index a68bfecf6f..3626b7cdb4 100644 --- a/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/RedirectingCachedTableModel.java +++ b/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/RedirectingCachedTableModel.java @@ -38,6 +38,18 @@ public void gotoPrevRow(int row) tableModel.gotoPrevRow(row); } + public void gotoNextFuzzyNew(int row) + { + if (tableModel != null) + tableModel.gotoNextFuzzyNew(row); + } + + public void gotoPrevFuzzyNew(int row) + { + if (tableModel != null) + tableModel.gotoPrevFuzzyNew(row); + } + public void gotoNextFuzzy(int row) { if (tableModel != null) @@ -50,6 +62,18 @@ public void gotoPrevFuzzy(int row) tableModel.gotoPrevFuzzy(row); } + public void gotoNextNew(int row) + { + if (tableModel != null) + tableModel.gotoNextNew(row); + } + + public void gotoPrevNew(int row) + { + if (tableModel != null) + tableModel.gotoPrevNew(row); + } + public void setRowValueOverride(int row, RowType rowValue) { // TODO ideally, we would just replace the affected row in the cache diff --git a/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/RedirectingTableModel.java b/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/RedirectingTableModel.java index 628f74dc10..f2ec488c9b 100644 --- a/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/RedirectingTableModel.java +++ b/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/RedirectingTableModel.java @@ -79,6 +79,18 @@ public void gotoPrevRow(int row) tableModelHandler.gotoPrevRow(row); } + public void gotoNextFuzzyNew(int row) + { + if (tableModelHandler != null) + tableModelHandler.nextFuzzyNewIndex(row); + } + + public void gotoPrevFuzzyNew(int row) + { + if (tableModelHandler != null) + tableModelHandler.prevFuzzyNewIndex(row); + } + public void gotoNextFuzzy(int row) { if (tableModelHandler != null) @@ -90,4 +102,16 @@ public void gotoPrevFuzzy(int row) if (tableModelHandler != null) tableModelHandler.prevFuzzyIndex(row); } + + public void gotoNextNew(int row) + { + if (tableModelHandler != null) + tableModelHandler.nextNewIndex(row); + } + + public void gotoPrevNew(int row) + { + if (tableModelHandler != null) + tableModelHandler.prevNewIndex(row); + } } diff --git a/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableEditorPresenter.java b/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableEditorPresenter.java index d6c9f6ae68..068855bd0b 100644 --- a/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableEditorPresenter.java +++ b/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableEditorPresenter.java @@ -143,9 +143,15 @@ public interface Display extends WidgetDisplay, HasPageNavigation private final Identity identity; private TransUnit selectedTransUnit; // private int lastRowNum; + private List transIdNextNewFuzzyCache = new ArrayList(); + private List transIdPrevNewFuzzyCache = new ArrayList(); + private List transIdNextFuzzyCache = new ArrayList(); private List transIdPrevFuzzyCache = new ArrayList(); + private List transIdNextNewCache = new ArrayList(); + private List transIdPrevNewCache = new ArrayList(); + private int curRowIndex; private int curPage; @@ -293,10 +299,10 @@ public void onTransUnitUpdated(TransUnitUpdatedEvent event) if (documentId != null && documentId.equals(event.getDocumentId())) { // Clear the cache - if (!transIdNextFuzzyCache.isEmpty()) - transIdNextFuzzyCache.clear(); - if (!transIdPrevFuzzyCache.isEmpty()) - transIdPrevFuzzyCache.clear(); + if (!transIdNextNewFuzzyCache.isEmpty()) + transIdNextNewFuzzyCache.clear(); + if (!transIdPrevNewFuzzyCache.isEmpty()) + transIdPrevNewFuzzyCache.clear(); // TODO this test never succeeds if (selectedTransUnit != null && selectedTransUnit.getId().equals(event.getTransUnit().getId())) { @@ -407,12 +413,12 @@ public void onNavTransUnit(NavTransUnitEvent event) if (event.getRowType() == NavigationType.PrevFuzzyOrUntranslated) { - editor.saveAndMoveNextFuzzy(NavigationType.PrevEntry); + editor.saveAndMoveNextState(NavigationType.PrevEntry); } if (event.getRowType() == NavigationType.NextFuzzyOrUntranslated) { - editor.saveAndMoveNextFuzzy(NavigationType.NextEntry); + editor.saveAndMoveNextState(NavigationType.NextEntry); } } @@ -616,11 +622,19 @@ public void onCancel(TransUnit rowValue) // stopEditing(rowValue); } - @Override - public void gotoNextRow(int row) + public void updatePageAndRowIndex(int row) { curPage = display.getCurrentPage(); + + // Convert row number to row Index in table curRowIndex = curPage * TableConstants.PAGE_SIZE + row; + Log.info("Current Row Index" + curRowIndex); + } + + @Override + public void gotoNextRow(int row) + { + updatePageAndRowIndex(row); int rowIndex = curPage * TableConstants.PAGE_SIZE + row + 1; if (rowIndex < display.getTableModel().getRowCount()) { @@ -631,8 +645,7 @@ public void gotoNextRow(int row) @Override public void gotoPrevRow(int row) { - curPage = display.getCurrentPage(); - curRowIndex = curPage * TableConstants.PAGE_SIZE + row; + updatePageAndRowIndex(row); int rowIndex = curPage * TableConstants.PAGE_SIZE + row - 1; if (rowIndex >= 0) { @@ -640,26 +653,52 @@ public void gotoPrevRow(int row) } } + @Override + public void nextFuzzyNewIndex(int row) + { + updatePageAndRowIndex(row); + if (curRowIndex < display.getTableModel().getRowCount()) + gotoNextState(true, true); + } + + @Override + public void prevFuzzyNewIndex(int row) + { + updatePageAndRowIndex(row); + if (curRowIndex > 0) + gotoPrevState(true, true); + } + @Override public void nextFuzzyIndex(int row) { - // Convert row number to row Index in table - curPage = display.getCurrentPage(); - curRowIndex = curPage * TableConstants.PAGE_SIZE + row; - Log.info("Current Row Index" + curRowIndex); + updatePageAndRowIndex(row); if (curRowIndex < display.getTableModel().getRowCount()) - gotoNextState(); + gotoNextState(false, true); } @Override public void prevFuzzyIndex(int row) { - // Convert row number to row Index in table - curPage = display.getCurrentPage(); - curRowIndex = curPage * TableConstants.PAGE_SIZE + row; - Log.info("Current Row Index" + curRowIndex); + updatePageAndRowIndex(row); + if (curRowIndex > 0) + gotoPrevState(false, true); + } + + @Override + public void nextNewIndex(int row) + { + updatePageAndRowIndex(row); + if (curRowIndex < display.getTableModel().getRowCount()) + gotoNextState(true, false); + } + + @Override + public void prevNewIndex(int row) + { + updatePageAndRowIndex(row); if (curRowIndex > 0) - gotoPrevState(); + gotoPrevState(true, false); } @Override @@ -706,10 +745,10 @@ public void onFailure(Throwable caught) boolean isReqComplete = true; - private void cacheNextFuzzy(final NavigationCacheCallback callBack) + private void cacheNextState(final NavigationCacheCallback callBack, final List cacheList, final boolean isNewState, final boolean isFuzzyState) { isReqComplete = false; - dispatcher.execute(new GetTransUnitsNavigation(selectedTransUnit.getId().getId(), 3, false, findMessage), new AsyncCallback() + dispatcher.execute(new GetTransUnitsNavigation(selectedTransUnit.getId().getId(), 3, false, findMessage, isNewState, isFuzzyState), new AsyncCallback() { @Override public void onSuccess(GetTransUnitsNavigationResult result) @@ -719,9 +758,9 @@ public void onSuccess(GetTransUnitsNavigationResult result) { for (Long offset : result.getUnits()) { - transIdNextFuzzyCache.add(offset + curRowIndex); + cacheList.add(offset + curRowIndex); } - callBack.nextFuzzy(); + callBack.next(isNewState, isFuzzyState); } } @@ -733,10 +772,10 @@ public void onFailure(Throwable caught) }); } - private void cachePrevFuzzy(final NavigationCacheCallback callBack) + private void cachePrevState(final NavigationCacheCallback callBack, final List cacheList, final boolean isNewState, final boolean isFuzzyState) { isReqComplete = false; - dispatcher.execute(new GetTransUnitsNavigation(selectedTransUnit.getId().getId(), 3, true, findMessage), new AsyncCallback() + dispatcher.execute(new GetTransUnitsNavigation(selectedTransUnit.getId().getId(), 3, true, findMessage, isNewState, isFuzzyState), new AsyncCallback() { @Override public void onSuccess(GetTransUnitsNavigationResult result) @@ -746,9 +785,9 @@ public void onSuccess(GetTransUnitsNavigationResult result) { for (Long offset : result.getUnits()) { - transIdPrevFuzzyCache.add(curRowIndex - offset); + cacheList.add(curRowIndex - offset); } - callBack.prevFuzzy(); + callBack.prev(isNewState, isFuzzyState); } } @@ -760,93 +799,135 @@ public void onFailure(Throwable caught) }); } - private void gotoPrevState() + NavigationCacheCallback cacheCallback = new NavigationCacheCallback() + { + @Override + public void next(boolean isNewState, boolean isFuzzyState) + { + gotoNextState(isNewState, isFuzzyState); + } + + @Override + public void prev(boolean isNewState, boolean isFuzzyState) + { + gotoPrevState(isNewState, isFuzzyState); + } + + }; + + private void gotoNextState(boolean isNewState, boolean isFuzzyState) + { + if (isNewState && isFuzzyState) + { + Log.info("go to Next Fuzzy Or Untranslated State"); + transIdPrevNewFuzzyCache.clear(); + gotoNextState(transIdNextNewFuzzyCache, true, true); + } + else if (isNewState) + { + Log.info("go to Next Untranslated State"); + transIdPrevNewCache.clear(); + gotoNextState(transIdNextNewCache, true, false); + } + else if (isFuzzyState) + { + Log.info("go to Next Fuzzy State"); + transIdPrevFuzzyCache.clear(); + gotoNextState(transIdNextFuzzyCache, false, true); + } + } + + private void gotoPrevState(boolean isNewState, boolean isFuzzyState) { - Log.info("Previous FuzzyOrUntranslated State"); + if (isNewState && isFuzzyState) + { + Log.info("go to Prev Fuzzy Or Untranslated State"); + // Clean the cache for Next Fuzzy to avoid issues about cache is + // obsolete + transIdNextNewFuzzyCache.clear(); + gotoPrevState(transIdPrevNewFuzzyCache, true, true); + } + else if (isNewState) + { + Log.info("go to Prev Untranslated State"); + // Clean the cache for Next Fuzzy to avoid issues about cache is + // obsolete + transIdNextNewCache.clear(); + gotoPrevState(transIdPrevNewCache, true, false); + } + else if (isFuzzyState) + { + Log.info("go to Prev Fuzzy State"); + // Clean the cache for Next Fuzzy to avoid issues about cache is + // obsolete + transIdNextFuzzyCache.clear(); + gotoPrevState(transIdPrevFuzzyCache, false, true); + } + } - // Clean the cache for Next Fuzzy to avoid issues about cache is - // obsolete - transIdNextFuzzyCache.clear(); - // If the catch of fuzzy row is empty and request is complete, generate + private void gotoPrevState(List transIdPrevCache, boolean isNewState, boolean isFuzzyState) + { + // If the catch of row is empty and request is complete, generate // one - if (transIdPrevFuzzyCache.isEmpty()) + if (transIdPrevCache.isEmpty()) { if (isReqComplete) - cachePrevFuzzy(cacheCallback); + cachePrevState(cacheCallback, transIdPrevCache, isNewState, isFuzzyState); } else { - int size = transIdPrevFuzzyCache.size(); - int offset = transIdPrevFuzzyCache.get(size - 1).intValue(); + int size = transIdPrevCache.size(); + int offset = transIdPrevCache.get(size - 1).intValue(); if (curRowIndex > offset) { for (int i = 0; i < size; i++) { - int fuzzyRowIndex = transIdPrevFuzzyCache.get(i).intValue(); - if (curRowIndex > fuzzyRowIndex) + int newRowIndex = transIdPrevCache.get(i).intValue(); + if (curRowIndex > newRowIndex) { display.getTargetCellEditor().cancelEdit(); - tableModelHandler.gotoRow(fuzzyRowIndex); + tableModelHandler.gotoRow(newRowIndex); break; } } } else { - transIdPrevFuzzyCache.clear(); - cachePrevFuzzy(cacheCallback); + transIdPrevCache.clear(); + cachePrevState(cacheCallback, transIdPrevCache, isNewState, isFuzzyState); } } } - NavigationCacheCallback cacheCallback = new NavigationCacheCallback() + private void gotoNextState(List transIdNextCache, boolean isNewState, boolean isFuzzyState) { - @Override - public void nextFuzzy() - { - gotoNextState(); - } - - @Override - public void prevFuzzy() - { - gotoPrevState(); - } - - }; - - private void gotoNextState() - { - Log.info("go to Next FuzzyOrUntranslated State"); - - transIdPrevFuzzyCache.clear(); - // If the cache of next fuzzy is empty, generate one - if (transIdNextFuzzyCache.isEmpty()) + // If the cache of next is empty, generate one + if (transIdNextCache.isEmpty()) { if (isReqComplete) - cacheNextFuzzy(cacheCallback); + cacheNextState(cacheCallback, transIdNextCache, isNewState, isFuzzyState); } else { - int size = transIdNextFuzzyCache.size(); - int offset = transIdNextFuzzyCache.get(size - 1).intValue(); + int size = transIdNextCache.size(); + int offset = transIdNextCache.get(size - 1).intValue(); if (curRowIndex < offset) { for (int i = 0; i < size; i++) { - int fuzzyRowIndex = transIdNextFuzzyCache.get(i).intValue(); - if (curRowIndex < fuzzyRowIndex) + int newRowIndex = transIdNextCache.get(i).intValue(); + if (curRowIndex < newRowIndex) { display.getTargetCellEditor().cancelEdit(); - tableModelHandler.gotoRow(fuzzyRowIndex); + tableModelHandler.gotoRow(newRowIndex); break; } } } else { - transIdNextFuzzyCache.clear(); - cacheNextFuzzy(cacheCallback); + transIdNextCache.clear(); + cacheNextState(cacheCallback, transIdNextCache, isNewState, isFuzzyState); } } } @@ -923,10 +1004,10 @@ public void selectTransUnit(TransUnit transUnit) selectedTransUnit = transUnit; Log.info("SelectedTransUnit " + selectedTransUnit.getId()); // Clean the cache when we click the new entry - if (!transIdNextFuzzyCache.isEmpty()) - transIdNextFuzzyCache.clear(); - if (!transIdPrevFuzzyCache.isEmpty()) - transIdPrevFuzzyCache.clear(); + if (!transIdNextNewFuzzyCache.isEmpty()) + transIdNextNewFuzzyCache.clear(); + if (!transIdPrevNewFuzzyCache.isEmpty()) + transIdPrevNewFuzzyCache.clear(); eventBus.fireEvent(new TransUnitSelectionEvent(selectedTransUnit)); } diff --git a/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableEditorTableDefinition.java b/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableEditorTableDefinition.java index bc6483bfda..a17159a0b6 100644 --- a/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableEditorTableDefinition.java +++ b/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableEditorTableDefinition.java @@ -274,16 +274,40 @@ public void gotoPrevRow(int row) } @Override - public void gotoNextFuzzy(int row) + public void gotoNextFuzzyNewRow(int row) + { + tableModel.gotoNextFuzzyNew(row); + } + + @Override + public void gotoPrevFuzzyNewRow(int row) + { + tableModel.gotoPrevFuzzyNew(row); + } + + @Override + public void gotoNextFuzzyRow(int row) { tableModel.gotoNextFuzzy(row); } @Override - public void gotoPrevFuzzy(int row) + public void gotoPrevFuzzyRow(int row) { tableModel.gotoPrevFuzzy(row); } + + @Override + public void gotoNextNewRow(int row) + { + tableModel.gotoNextNew(row); + } + + @Override + public void gotoPrevNewRow(int row) + { + tableModel.gotoPrevNew(row); + } }; this.targetCellEditor = new InlineTargetCellEditor(messages, cancelCallBack, transValueCallBack, eventBus); diff --git a/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableModelHandler.java b/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableModelHandler.java index 2698ae90e6..74e140a933 100644 --- a/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableModelHandler.java +++ b/server/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableModelHandler.java @@ -25,9 +25,17 @@ protected boolean onRowRemoved(int row) abstract void gotoPrevRow(int row); + abstract void nextFuzzyNewIndex(int row); + + abstract void prevFuzzyNewIndex(int row); + abstract void nextFuzzyIndex(int row); abstract void prevFuzzyIndex(int row); + abstract void nextNewIndex(int row); + + abstract void prevNewIndex(int row); + abstract void gotoRow(int row); } diff --git a/server/zanata-war/src/main/java/org/zanata/webtrans/client/events/NavConfigChangeEvent.java b/server/zanata-war/src/main/java/org/zanata/webtrans/client/events/NavConfigChangeEvent.java new file mode 100644 index 0000000000..65f72f6080 --- /dev/null +++ b/server/zanata-war/src/main/java/org/zanata/webtrans/client/events/NavConfigChangeEvent.java @@ -0,0 +1,57 @@ +package org.zanata.webtrans.client.events; + +import java.util.HashMap; +import java.util.Map; + +import org.zanata.common.ContentState; +import org.zanata.webtrans.client.editor.table.TableConstants; + +import com.google.gwt.event.shared.GwtEvent; + +public class NavConfigChangeEvent extends GwtEvent +{ + + /** + * Handler type. + */ + private static Type TYPE; + + /** + * Gets the type associated with this event. + * + * @return returns the handler type + */ + public static Type getType() + { + if (TYPE == null) + { + TYPE = new Type(); + } + return TYPE; + } + + private HashMap configMap; + + public NavConfigChangeEvent(Map configMap) + { + this.configMap = (HashMap) configMap; + } + + public Map getConfigMap() + { + return configMap; + } + + @Override + protected void dispatch(NavConfigChangeHandler handler) + { + handler.onValueChanged(this); + } + + @Override + public Type getAssociatedType() + { + return getType(); + } + +} \ No newline at end of file diff --git a/server/zanata-war/src/main/java/org/zanata/webtrans/client/events/NavConfigChangeHandler.java b/server/zanata-war/src/main/java/org/zanata/webtrans/client/events/NavConfigChangeHandler.java new file mode 100644 index 0000000000..ad7ee9f5a1 --- /dev/null +++ b/server/zanata-war/src/main/java/org/zanata/webtrans/client/events/NavConfigChangeHandler.java @@ -0,0 +1,8 @@ +package org.zanata.webtrans.client.events; + +import com.google.gwt.event.shared.EventHandler; + +public interface NavConfigChangeHandler extends EventHandler +{ + void onValueChanged(NavConfigChangeEvent event); +} \ No newline at end of file diff --git a/server/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ShortcutConfigPanel.java b/server/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ShortcutConfigPanel.java new file mode 100644 index 0000000000..1cefe9794a --- /dev/null +++ b/server/zanata-war/src/main/java/org/zanata/webtrans/client/ui/ShortcutConfigPanel.java @@ -0,0 +1,144 @@ +/* + * Copyright 2011, Red Hat, Inc. and individual contributors + * as indicated by the @author tags. See the copyright.txt file in the + * distribution for a full listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this software; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. + */ +package org.zanata.webtrans.client.ui; + +import java.util.HashMap; +import java.util.Map; + +import net.customware.gwt.presenter.client.EventBus; + +import org.zanata.common.ContentState; +import org.zanata.webtrans.client.events.NavConfigChangeEvent; + +import com.allen_sauer.gwt.log.client.Log; +import com.google.gwt.event.logical.shared.ValueChangeEvent; +import com.google.gwt.event.logical.shared.ValueChangeHandler; +import com.google.gwt.user.client.ui.CheckBox; +import com.google.gwt.user.client.ui.DecoratedPopupPanel; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.UIObject; + +/** + * + * @author Alex Eng aeng@redhat.com + * + **/ +public class ShortcutConfigPanel extends DecoratedPopupPanel +{ + private final CheckBox fuzzyChk = new CheckBox("Fuzzy"); + private final CheckBox untranslatedChk = new CheckBox("Untranslated"); + + private Map configMap = new HashMap(); + + private EventBus eventBus; + private boolean isHidden = true; + + public ShortcutConfigPanel(boolean autoHide, EventBus eventBus) + { + super(autoHide); + this.eventBus = eventBus; + init(); + bindEvent(); + setDefaultValue(); + } + + private void init() + { + FlowPanel mainPanel = new FlowPanel(); + mainPanel.add(new Label("Select navigation options:")); + + HorizontalPanel optionsHP = new HorizontalPanel(); + optionsHP.setSpacing(5); + optionsHP.add(fuzzyChk); + optionsHP.add(untranslatedChk); + mainPanel.add(optionsHP); + + this.add(mainPanel); + } + + private void bindEvent() + { + fuzzyChk.addValueChangeHandler(new ValueChangeHandler() + { + @Override + public void onValueChange(ValueChangeEvent event) + { + if (event.getValue() == false && untranslatedChk.getValue() == false) + { + setDefaultValue(); + } + else + { + configMap.put(ContentState.NeedReview, event.getValue()); + } + Log.info("Navigation mode changed: Untranslated-" + untranslatedChk.getValue() + " Fuzzy-" + fuzzyChk.getValue()); + eventBus.fireEvent(new NavConfigChangeEvent(configMap)); + } + }); + + untranslatedChk.addValueChangeHandler(new ValueChangeHandler() + { + @Override + public void onValueChange(ValueChangeEvent event) + { + if (event.getValue() == false && fuzzyChk.getValue() == false) + { + setDefaultValue(); + } + else + { + configMap.put(ContentState.New, event.getValue()); + } + Log.info("Navigation mode changed: Untranslated-" + untranslatedChk.getValue() + " Fuzzy-" + fuzzyChk.getValue()); + eventBus.fireEvent(new NavConfigChangeEvent(configMap)); + } + }); + + } + + private void setDefaultValue() + { + fuzzyChk.setValue(true); + untranslatedChk.setValue(true); + + configMap.put(ContentState.NeedReview, true); + configMap.put(ContentState.New, true); + } + + public void toggleDisplay(final UIObject target) + { + if (isHidden) + { + isHidden = false; + showRelativeTo(target); + } + else + { + isHidden = true; + hide(); + } + } +} + + + \ No newline at end of file diff --git a/server/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/GetTransUnitNavigationHandler.java b/server/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/GetTransUnitNavigationHandler.java index b6e1b3de04..3fdff99762 100644 --- a/server/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/GetTransUnitNavigationHandler.java +++ b/server/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/GetTransUnitNavigationHandler.java @@ -94,7 +94,7 @@ public GetTransUnitsNavigationResult execute(GetTransUnitsNavigation action, Exe step++; HTextFlow textFlow = textFlowDAO.findById(textFlowId, false); HTextFlowTarget textFlowTarget = textFlow.getTargets().get(hLocale); - if (checkNewFuzzyState(textFlowTarget)) + if (checkStateAndValidate(action.isNewState(), action.isFuzzyState(), textFlowTarget)) { results.add(step); log.info("add navigation step: " + step); @@ -118,7 +118,8 @@ public GetTransUnitsNavigationResult execute(GetTransUnitsNavigation action, Exe { step++; HTextFlowTarget textFlowTarget = textFlow.getTargets().get(hLocale); - if (checkNewFuzzyState(textFlowTarget)) + log.info(action.isNewState() + ":" + action.isFuzzyState() + ":" + checkStateAndValidate(action.isNewState(), action.isFuzzyState(), textFlowTarget)); + if (checkStateAndValidate(action.isNewState(), action.isFuzzyState(), textFlowTarget)) { results.add(step); log.info("add navigation step: " + step); @@ -140,10 +141,36 @@ public void rollback(GetTransUnitsNavigation action, GetTransUnitsNavigationResu { } - private boolean checkNewFuzzyState(HTextFlowTarget textFlowTarget) + private boolean checkStateAndValidate(boolean isNewState, boolean isFuzzyState, HTextFlowTarget textFlowTarget) + { + if (isNewState && isFuzzyState) + { + return isNewFuzzyState(textFlowTarget); + } + else if (isFuzzyState) + { + return isFuzzyState(textFlowTarget); + } + else if (isNewState) + { + return isNewState(textFlowTarget); + } + return false; + } + + private boolean isNewFuzzyState(HTextFlowTarget textFlowTarget) { return textFlowTarget == null || textFlowTarget.getState() == ContentState.New || textFlowTarget.getState() == ContentState.NeedReview; } + private boolean isFuzzyState(HTextFlowTarget textFlowTarget) + { + return textFlowTarget != null && textFlowTarget.getState() == ContentState.NeedReview; + } + + private boolean isNewState(HTextFlowTarget textFlowTarget) + { + return textFlowTarget == null || textFlowTarget.getState() == ContentState.New; + } } diff --git a/server/zanata-war/src/main/java/org/zanata/webtrans/shared/rpc/GetTransUnitsNavigation.java b/server/zanata-war/src/main/java/org/zanata/webtrans/shared/rpc/GetTransUnitsNavigation.java index a70f378fd3..ea03150b2e 100644 --- a/server/zanata-war/src/main/java/org/zanata/webtrans/shared/rpc/GetTransUnitsNavigation.java +++ b/server/zanata-war/src/main/java/org/zanata/webtrans/shared/rpc/GetTransUnitsNavigation.java @@ -31,18 +31,21 @@ public class GetTransUnitsNavigation extends AbstractWorkspaceAction