diff --git a/zanata-model/src/main/java/org/zanata/model/HTextFlow.java b/zanata-model/src/main/java/org/zanata/model/HTextFlow.java index d4bbf10dde..2d0a1e5fc6 100644 --- a/zanata-model/src/main/java/org/zanata/model/HTextFlow.java +++ b/zanata-model/src/main/java/org/zanata/model/HTextFlow.java @@ -303,7 +303,9 @@ public Map getHistory() public Map getTargets() { if (targets == null) + { targets = new HashMap(); + } return targets; } diff --git a/zanata-model/src/main/java/org/zanata/model/HTextFlowTarget.java b/zanata-model/src/main/java/org/zanata/model/HTextFlowTarget.java index fa17d584b0..f3601794d6 100644 --- a/zanata-model/src/main/java/org/zanata/model/HTextFlowTarget.java +++ b/zanata-model/src/main/java/org/zanata/model/HTextFlowTarget.java @@ -69,8 +69,11 @@ import org.zanata.hibernate.search.LocaleIdBridge; import org.zanata.hibernate.search.StringListBridge; +import com.google.common.base.Objects; + import lombok.NoArgsConstructor; import lombok.Setter; +import lombok.ToString; /** * Represents a flow of translated text that should be processed as a @@ -317,21 +320,17 @@ private void copyLazyLoadedRelationsToHistory() } } - /** - * Used for debugging - */ @Override public String toString() { - return new StringBuilder().append("HTextFlowTarget(") - .append("contents:").append(getContents()) - .append(" locale:").append(getLocale()) - .append(" state:").append(getState()) - .append(" comment:").append(getComment()) - .append(" textflow:").append(getTextFlow().getContents()) - .append(")").toString(); + return Objects.toStringHelper(this). + add("contents", getContents()). + add("locale", getLocale()). + add("state", getState()). + add("comment", getComment()). + add("textFlow", getTextFlow().getContents()). + toString(); } - @Transient public void clear() { diff --git a/zanata-war/src/main/java/org/zanata/dao/TextFlowDAO.java b/zanata-war/src/main/java/org/zanata/dao/TextFlowDAO.java index 049c3dc699..f8e3241952 100644 --- a/zanata-war/src/main/java/org/zanata/dao/TextFlowDAO.java +++ b/zanata-war/src/main/java/org/zanata/dao/TextFlowDAO.java @@ -33,6 +33,7 @@ import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.Session; +import org.hibernate.criterion.CriteriaSpecification; import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; import org.hibernate.search.jpa.FullTextEntityManager; @@ -123,6 +124,7 @@ public List getNavigationByDocumentId(Long documentId) { Criteria c = getSession().createCriteria(HTextFlow.class); c.add(Restrictions.eq("document.id", documentId)).add(Restrictions.eq("obsolete", false)); + c.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); c.setCacheable(true).setComment("TextFlowDAO.getNavigationByDocumentId"); c.addOrder(Order.asc("pos")); diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/EditRowCallback.java b/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/EditRowCallback.java index d35c8fcefa..a95c117046 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/EditRowCallback.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/EditRowCallback.java @@ -1,6 +1,8 @@ package org.zanata.webtrans.client.editor.table; +import org.zanata.webtrans.shared.model.TransUnit; + public interface EditRowCallback { void gotoNextRow(); @@ -22,4 +24,8 @@ public interface EditRowCallback void gotoNextNewRow(); void gotoPrevNewRow(); + + void gotoCurrentRow(boolean andEdit); + + void setRowValueOverride(int row, TransUnit targetCell); } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/InlineTargetCellEditor.java b/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/InlineTargetCellEditor.java index e706069950..a7ca0c8531 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/InlineTargetCellEditor.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/InlineTargetCellEditor.java @@ -35,337 +35,306 @@ import com.google.common.collect.Collections2; import com.google.gwt.gen2.table.client.CellEditor; import com.google.gwt.gen2.table.override.client.HTMLTable; -import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; -public class InlineTargetCellEditor implements CellEditor, TransUnitsEditModel -{ - /** - * Default style name. - */ - public static final String DEFAULT_STYLENAME = "gwt-TargetCellEditor"; - - /** - * The current {@link CellEditor.Callback}. - */ - private Callback curCallback = null; - - private CancelCallback cancelCallback = null; - - private EditRowCallback editRowCallback = null; - - /** - * The current {@link CellEditor.CellEditInfo}. - */ - private CellEditInfo curCellEditInfo = null; - - private TransUnit cellValue; - - private boolean isOpened = false; - private boolean isCancelButtonFocused = false; - private boolean isReadOnly; - private TargetContentsPresenter targetContentsPresenter; - - private int curRow; - private int curCol; - private HTMLTable table; - - /** - * Construct a new {@link InlineTargetCellEditor} with the specified images. - */ - public InlineTargetCellEditor(CancelCallback callback, EditRowCallback rowCallback, final boolean isReadOnly, TargetContentsPresenter targetContentsPresenter) - { - this.isReadOnly = isReadOnly; - this.targetContentsPresenter = targetContentsPresenter; - this.targetContentsPresenter.setCellEditor(this); - - cancelCallback = callback; - editRowCallback = rowCallback; - } - - private void gotoRow(NavigationType nav) - { - if (nav == NavigationType.NextEntry) - { - editRowCallback.gotoNextRow(); - } - else if (nav == NavigationType.PrevEntry) - { - editRowCallback.gotoPrevRow(); - } - else if (nav == NavigationType.FirstEntry) - { - editRowCallback.gotoFirstRow(); - } - else if (nav == NavigationType.LastEntry) - { - editRowCallback.gotoLastRow(); - } - } - - @Override - public void gotoNewRow(NavigationType nav) - { - if (nav == NavigationType.NextEntry) - { - editRowCallback.gotoNextNewRow(); - } - else if (nav == NavigationType.PrevEntry) - { - editRowCallback.gotoPrevNewRow(); - } - } - - @Override - public void gotoFuzzyAndNewRow(NavigationType nav) - { - if (nav == NavigationType.NextEntry) - { - editRowCallback.gotoNextFuzzyNewRow(); - } - else if (nav == NavigationType.PrevEntry) - { - editRowCallback.gotoPrevFuzzyNewRow(); - } - } - - @Override - public void gotoFuzzyRow(NavigationType nav) - { - if (nav == NavigationType.NextEntry) - { - editRowCallback.gotoNextFuzzyRow(); - } - else if (nav == NavigationType.PrevEntry) - { - editRowCallback.gotoPrevFuzzyRow(); - } - } - - public boolean isEditing() - { - return cellValue != null && targetContentsPresenter.isEditing(); - } - - public boolean isOpened() - { - return isOpened; - } - - @Override - public void editCell(CellEditInfo cellEditInfo, TransUnit cellValue, Callback callback) - { - if (isReadOnly) - { - return; - } - - if (isEditing()) - { - if (cellEditInfo.getCellIndex() == curCol && cellEditInfo.getRowIndex() == curRow) - { - return; - } - } - - // save the content in previous cell before start new editing - if (curRow != cellEditInfo.getRowIndex()) - { - savePendingChange(false); - } - - Log.debug("starting edit"); - - // Save the current values - curCallback = callback; - curCellEditInfo = cellEditInfo; - - // Get the info about the cell - table = curCellEditInfo.getTable(); - - curRow = curCellEditInfo.getRowIndex(); - curCol = curCellEditInfo.getCellIndex(); - - this.cellValue = cellValue; - targetContentsPresenter.showEditors(curRow, TargetContentsPresenter.NO_OPEN_EDITOR); - - isOpened = true; - - Element element = table.getCellFormatter().getElement(curRow, curCol); - TableEditorView.scrollIntoView(element); - } - - @Override - public void savePendingChange(boolean cancelIfUnchanged) - { - if (isEditing()) - { - // if something has changed, save as approved - if (hasTargetContentsChanged()) - { - Log.debug("savePendingChange - acceptEdit"); - acceptEdit(); - } - } - else if (cancelIfUnchanged) - { - Log.debug("savePendingChange- cancel edit"); - cancelEdit(); - } - targetContentsPresenter.setToViewMode(); - } - - public boolean hasTargetContentsChanged() - { - return !cellValue.getTargets().equals(targetContentsPresenter.getNewTargets()); - } - - @Override - public void saveAndMoveRow(NavigationType nav) - { - savePendingChange(true); - gotoRow(nav); - } - - /** - * Accept the contents of the cell editor as the new cell value. - */ - @Override - public void acceptEdit() - { - // Check if we are ready to accept - if (!onAccept()) - { - return; - } - ArrayList newTargets = targetContentsPresenter.getNewTargets(); - cellValue.setTargets(newTargets); - determineStatus(newTargets, ContentState.Approved); - - targetContentsPresenter.setToViewMode(); - isOpened = false; - - // Send the new cell value to the callback - curCallback.onComplete(curCellEditInfo, cellValue); - clearSelection(); - } - - /** - * Save the contents of the cell and set status to fuzzy. - */ - @Override - public void acceptFuzzyEdit() - { - // String text = textArea.getText(); - ArrayList newTargets = targetContentsPresenter.getNewTargets(); - cellValue.setTargets(newTargets); - determineStatus(newTargets, ContentState.NeedReview); - curCallback.onComplete(curCellEditInfo, cellValue); - } - - private void determineStatus(ArrayList newTargets, ContentState requestedState) - { - Collection emptyTargets = Collections2.filter(newTargets, new Predicate() - { - @Override - public boolean apply(@Nullable String input) - { - return Strings.isNullOrEmpty(input); - } - }); - - // TODO check that this is consistent with server-side checks - ContentState stateToSet = requestedState; - if (requestedState == ContentState.New && emptyTargets.isEmpty()) - { - stateToSet = ContentState.NeedReview; - } - if (requestedState == ContentState.Approved && !emptyTargets.isEmpty()) - { - stateToSet = ContentState.New; - } - cellValue.setStatus(stateToSet); - } - - /** - * Cancel the cell edit. - */ - public void cancelEdit() - { - // Fire the event - if (!onCancel()) - { - return; - } - - targetContentsPresenter.setToViewMode(); - isOpened = false; - - // Call the callback - if (curCallback != null) - { - // curCallback.onCancel(curCellEditInfo); - cancelCallback.onCancel(cellValue); - } - - clearSelection(); - } - - public void clearSelection() - { - curCallback = null; - curCellEditInfo = null; - /* - * The main grid used for layout. - */ - cellValue = null; - } - - /** - * Called before an accept takes place. - * - * @return true to allow the accept, false to prevent it - */ - protected boolean onAccept() - { - return true; - } - - /** - * Called before a cancel takes place. - * - * @return true to allow the cancel, false to prevent it - */ - protected boolean onCancel() - { - return true; - } - - public boolean isCancelButtonFocused() - { - return isCancelButtonFocused; - } - - public void setCancelButtonFocused(boolean isCancelButtonFocused) - { - this.isCancelButtonFocused = isCancelButtonFocused; - } - - @Override - public TransUnit getTargetCell() - { - return cellValue; - } - - public void setReadOnly(boolean isReadOnly) - { - this.isReadOnly = isReadOnly; - // cancelEdit(); - } - - public void showEditors(int rowIndex, int editorIndex) - { - targetContentsPresenter.showEditors(rowIndex, editorIndex); - - } +public class InlineTargetCellEditor implements CellEditor, + TransUnitsEditModel { + /** + * Default style name. + */ + public static final String DEFAULT_STYLENAME = "gwt-TargetCellEditor"; + + /** + * The current {@link CellEditor.Callback}. + */ + private Callback curCallback = null; + + private CancelCallback cancelCallback = null; + + private EditRowCallback editRowCallback = null; + + /** + * The current {@link CellEditor.CellEditInfo}. + */ + private CellEditInfo curCellEditInfo = null; + + private TransUnit cellValue; + + private boolean isOpened = false; + private boolean isCancelButtonFocused = false; + private boolean isReadOnly; + private TargetContentsPresenter targetContentsPresenter; + + private int curRow; + private int curCol; + private HTMLTable table; + + /** + * Construct a new {@link InlineTargetCellEditor} with the specified images. + */ + public InlineTargetCellEditor(CancelCallback callback, + EditRowCallback rowCallback, final boolean isReadOnly, + TargetContentsPresenter targetContentsPresenter) { + this.isReadOnly = isReadOnly; + this.targetContentsPresenter = targetContentsPresenter; + this.targetContentsPresenter.setCellEditor(this); + + cancelCallback = callback; + editRowCallback = rowCallback; + } + + private void gotoRow(NavigationType nav) { + if (nav == NavigationType.NextEntry) { + editRowCallback.gotoNextRow(); + } else if (nav == NavigationType.PrevEntry) { + editRowCallback.gotoPrevRow(); + } else if (nav == NavigationType.FirstEntry) { + editRowCallback.gotoFirstRow(); + } else if (nav == NavigationType.LastEntry) { + editRowCallback.gotoLastRow(); + } + } + + @Override + public void gotoNewRow(NavigationType nav) { + if (nav == NavigationType.NextEntry) { + editRowCallback.gotoNextNewRow(); + } else if (nav == NavigationType.PrevEntry) { + editRowCallback.gotoPrevNewRow(); + } + } + + @Override + public void gotoCurrentRow(boolean andEdit) { + editRowCallback.gotoCurrentRow(andEdit); + } + + @Override + public void gotoFuzzyAndNewRow(NavigationType nav) { + if (nav == NavigationType.NextEntry) { + editRowCallback.gotoNextFuzzyNewRow(); + } else if (nav == NavigationType.PrevEntry) { + editRowCallback.gotoPrevFuzzyNewRow(); + } + } + + @Override + public void gotoFuzzyRow(NavigationType nav) { + if (nav == NavigationType.NextEntry) { + editRowCallback.gotoNextFuzzyRow(); + } else if (nav == NavigationType.PrevEntry) { + editRowCallback.gotoPrevFuzzyRow(); + } + } + + public boolean isEditing() { + return cellValue != null && targetContentsPresenter.isEditing(); + } + + public boolean isOpened() { + return isOpened; + } + + @Override + public void editCell(CellEditInfo cellEditInfo, TransUnit cellValue, + Callback callback) { + if (isReadOnly) { + return; + } + + if (isEditing()) { + if (cellEditInfo.getCellIndex() == curCol + && cellEditInfo.getRowIndex() == curRow) { + return; + } + } + + // save the content in previous cell before start new editing + if (curRow != cellEditInfo.getRowIndex()) { + savePendingChange(false); + } + + Log.debug("starting edit"); + + // Save the current values + curCallback = callback; + curCellEditInfo = cellEditInfo; + + // Get the info about the cell + table = curCellEditInfo.getTable(); + + curRow = curCellEditInfo.getRowIndex(); + curCol = curCellEditInfo.getCellIndex(); + + this.cellValue = cellValue; + targetContentsPresenter.showEditors(curRow, + TargetContentsPresenter.NO_OPEN_EDITOR); + + isOpened = true; + + Element element = table.getCellFormatter().getElement(curRow, curCol); + TableEditorView.scrollIntoView(element); + } + + @Override + public void savePendingChange(boolean cancelIfUnchanged) { + if (isEditing()) { + // if something has changed, save as approved + if (hasTargetContentsChanged()) { + Log.debug("savePendingChange - acceptEdit"); + acceptEdit(); + } + } else if (cancelIfUnchanged) { + Log.debug("savePendingChange- cancel edit"); + cancelEdit(); + } + targetContentsPresenter.setToViewMode(); + } + + public boolean hasTargetContentsChanged() { + return !cellValue.getTargets().equals( + targetContentsPresenter.getNewTargets()); + } + + @Override + public void saveAndMoveRow(NavigationType nav) { + savePendingChange(true); + gotoRow(nav); + } + + /** + * Accept the contents of the cell editor as the new cell value. + */ + @Override + public void acceptEdit() { + // Check if we are ready to accept + if (!onAccept()) { + return; + } + ArrayList newTargets = targetContentsPresenter.getNewTargets(); + cellValue.setTargets(newTargets); + determineStatus(newTargets, ContentState.Approved); + + targetContentsPresenter.setToViewMode(); + isOpened = false; + + // Send the new cell value to the callback + curCallback.onComplete(curCellEditInfo, cellValue); + clearSelection(); + } + + /** + * Save the contents of the cell and set status to fuzzy. + */ + @Override + public void acceptFuzzyEdit() { + // String text = textArea.getText(); + ArrayList newTargets = targetContentsPresenter.getNewTargets(); + cellValue.setTargets(newTargets); + determineStatus(newTargets, ContentState.NeedReview); + curCallback.onComplete(curCellEditInfo, cellValue); + } + + private void determineStatus(ArrayList newTargets, + ContentState requestedState) { + Collection emptyTargets = Collections2.filter(newTargets, + new Predicate() { + @Override + public boolean apply(@Nullable String input) { + return Strings.isNullOrEmpty(input); + } + }); + + // TODO check that this is consistent with server-side checks + ContentState stateToSet = requestedState; + if (requestedState == ContentState.New && emptyTargets.isEmpty()) { + stateToSet = ContentState.NeedReview; + } + if (requestedState == ContentState.Approved && !emptyTargets.isEmpty()) { + stateToSet = ContentState.New; + } + cellValue.setStatus(stateToSet); + } + + /** + * Cancel the cell edit. + */ + public void cancelEdit() { + // Fire the event + if (!onCancel()) { + return; + } + + targetContentsPresenter.setToViewMode(); + isOpened = false; + + // Call the callback + if (curCallback != null) { + // curCallback.onCancel(curCellEditInfo); + cancelCallback.onCancel(cellValue); + } + + clearSelection(); + } + + public void clearSelection() { + curCallback = null; + curCellEditInfo = null; + /* + * The main grid used for layout. + */ + cellValue = null; + } + + /** + * Called before an accept takes place. + * + * @return true to allow the accept, false to prevent it + */ + protected boolean onAccept() { + return true; + } + + /** + * Called before a cancel takes place. + * + * @return true to allow the cancel, false to prevent it + */ + protected boolean onCancel() { + return true; + } + + public boolean isCancelButtonFocused() { + return isCancelButtonFocused; + } + + public void setCancelButtonFocused(boolean isCancelButtonFocused) { + this.isCancelButtonFocused = isCancelButtonFocused; + } + + @Override + public TransUnit getTargetCell() { + return cellValue; + } + + public void setReadOnly(boolean isReadOnly) { + this.isReadOnly = isReadOnly; + // cancelEdit(); + } + + public void showEditors(int rowIndex, int editorIndex) { + targetContentsPresenter.showEditors(rowIndex, editorIndex); + + } + + @Override + public int getCurrentRow() { + + return curRow; + } + + @Override + public void setRowValueOverride(int row, TransUnit targetCell) { + editRowCallback.setRowValueOverride(row, targetCell); + } } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/RedirectingCachedTableModel.java b/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/RedirectingCachedTableModel.java index e5d880c935..e401f5dde1 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/RedirectingCachedTableModel.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/RedirectingCachedTableModel.java @@ -89,7 +89,7 @@ public void gotoPrevNew() public void setRowValueOverride(int row, RowType rowValue) { // TODO ideally, we would just replace the affected row in the cache - clearCache(); +// clearCache(); quiet = true; try { @@ -115,4 +115,9 @@ public void setRowCount(int rowCount) super.setRowCount(rowCount); } + public void gotoCurrentRow(boolean andEdit) { + if (tableModel != null) { + tableModel.gotoCurrentRow(andEdit); + } + } } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/RedirectingTableModel.java b/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/RedirectingTableModel.java index d6b49e169d..fb6731c3c5 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/RedirectingTableModel.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/RedirectingTableModel.java @@ -126,4 +126,10 @@ public void gotoPrevNew() if (tableModelHandler != null) tableModelHandler.prevNewIndex(); } + + public void gotoCurrentRow(boolean andEdit) { + if (tableModelHandler != null) { + tableModelHandler.gotoCurrentRow(andEdit); + } + } } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableEditorPresenter.java b/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableEditorPresenter.java index bf2fb51d27..399bb3f575 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableEditorPresenter.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableEditorPresenter.java @@ -109,7 +109,7 @@ public interface Display extends WidgetDisplay, HasPageNavigation RedirectingCachedTableModel getTableModel(); - void setTableModelHandler(TableModelHandler hadler); + void setTableModelHandler(TableModelHandler handler); void reloadPage(); @@ -148,6 +148,8 @@ public interface Display extends WidgetDisplay, HasPageNavigation boolean isProcessing(); void ignoreStopProcessing(); + + TransUnit getRowValue(int row); } private DocumentId documentId; @@ -320,27 +322,32 @@ public void onTransUnitUpdated(TransUnitUpdatedEvent event) // assume update was successful if (documentId != null && documentId.equals(event.getUpdateInfo().getDocumentId())) { - // Clear the cache - if (selectedTransUnit != null && selectedTransUnit.getId().equals(event.getUpdateInfo().getTransUnit().getId())) + // if its different user, + if (!event.getSessionId().equals(identity.getSessionId())) { - Log.info("selected TU updated; clear selection"); - display.getTargetCellEditor().cancelEdit(); - eventBus.fireEvent(new RequestValidationEvent()); - } + if (selectedTransUnit != null && selectedTransUnit.getId().equals(event.getUpdateInfo().getTransUnit().getId())) + { + Log.info("selected TU updated; clear selection"); + // display.getTargetCellEditor().cancelEdit(); + eventBus.fireEvent(new RequestValidationEvent()); + } - Integer rowIndex = getRowIndex(event.getUpdateInfo().getTransUnit()); - // - add TU index to model - if (rowIndex != null) - { - Log.info("onTransUnitUpdated - update row:" + rowIndex); - display.getTableModel().setRowValueOverride(rowIndex, event.getUpdateInfo().getTransUnit()); - // alex - update transUnitModel list + // - add TU index to model + Integer rowIndex = getRowIndex(event.getUpdateInfo().getTransUnit()); + if (rowIndex != null) + { + Log.info("onTransUnitUpdated - update row:" + rowIndex); + display.getTableModel().setRowValueOverride(rowIndex, event.getUpdateInfo().getTransUnit()); + } } - // FIXME still intermittently causes interactions between - // different tabs - if (selectedTransUnit != null && !display.isProcessing() && event.getSessionId().equals(identity.getSessionId())) + else { - tableModelHandler.gotoRow(curRowIndex, true); + Integer rowIndex = getRowIndex(event.getUpdateInfo().getTransUnit()); + if (rowIndex != null) + { + display.getRowValue(rowIndex).OverrideWith(event.getUpdateInfo().getTransUnit()); + display.getTableModel().clearCache(); + } } } } @@ -371,7 +378,8 @@ public void onNavTransUnit(NavTransUnitEvent event) if (selectedTransUnit != null) { // int step = event.getStep(); - // Send message to server to stop editing current selection + // Send message to server to stop editing current + // selection // stopEditing(selectedTransUnit); // If goto Next or Prev Fuzzy/New Trans Unit @@ -633,7 +641,7 @@ public void onSuccess(UpdateTransUnitResult result) eventBus.fireEvent(new NotificationEvent(Severity.Info, messages.notifyUpdateSaved())); } }); - stopEditing(rowValue); + // stopEditing(rowValue); return true; } @@ -686,6 +694,13 @@ public void gotoLastRow() gotoRow(display.getTableModel().getRowCount() - 1, true); } + @Override + public void gotoCurrentRow(boolean andEdit) + { + updatePageAndRowIndex(); + gotoRow(curRowIndex, andEdit); + } + @Override public void nextFuzzyNewIndex() { @@ -769,7 +784,8 @@ private void stopEditing(TransUnit rowValue) @Override public void onSuccess(EditingTranslationResult result) { - // eventBus.fireEvent(new NotificationEvent(Severity.Warning, + // eventBus.fireEvent(new + // NotificationEvent(Severity.Warning, // "TransUnit Editing is finished")); } @@ -843,6 +859,7 @@ else if (isFuzzyState) // obsolete display.getTargetCellEditor().cancelEdit(); } + } public TransUnit getSelectedTransUnit() diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableEditorTableDefinition.java b/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableEditorTableDefinition.java index 92aa17c9db..da9ebadc92 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableEditorTableDefinition.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableEditorTableDefinition.java @@ -23,8 +23,6 @@ import java.util.HashMap; import java.util.Map; -import net.customware.gwt.presenter.client.EventBus; - import org.zanata.webtrans.client.presenter.SourceContentsPresenter; import org.zanata.webtrans.client.resources.NavigationMessages; import org.zanata.webtrans.client.ui.TransUnitDetailsPanel; @@ -53,7 +51,6 @@ public class TableEditorTableDefinition extends DefaultTableDefinition tableModel, final EventBus eventBus, final SourceContentsPresenter sourceContentsPresenter, boolean isReadOnly, TargetContentsPresenter targetContentsPresenter) + public TableEditorTableDefinition(final NavigationMessages messages, final RedirectingCachedTableModel tableModel, final SourceContentsPresenter sourceContentsPresenter, boolean isReadOnly, TargetContentsPresenter targetContentsPresenter) { this.isReadOnly = isReadOnly; - this.eventBus = eventBus; this.sourceContentsPresenter = sourceContentsPresenter; this.targetContentsPresenter = targetContentsPresenter; setRowRenderer(rowRenderer); @@ -238,11 +235,22 @@ public void gotoNextNewRow() tableModel.gotoNextNew(); } + @Override + public void gotoCurrentRow(boolean andEdit) + { + tableModel.gotoCurrentRow(andEdit); + } + @Override public void gotoPrevNewRow() { tableModel.gotoPrevNew(); } + + public void setRowValueOverride(int row, TransUnit targetCell) + { + tableModel.setRowValueOverride(row, targetCell); + } }; this.targetCellEditor = new InlineTargetCellEditor(cancelCallBack, transValueCallBack, isReadOnly, targetContentsPresenter); this.transUnitDetailsContent = new TransUnitDetailsPanel(messages.transUnitDetailsHeading()); diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableEditorView.java b/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableEditorView.java index 4ffcc66c2c..a57627c71a 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableEditorView.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableEditorView.java @@ -23,8 +23,6 @@ import java.util.List; import java.util.Set; -import net.customware.gwt.presenter.client.EventBus; - import org.zanata.webtrans.client.editor.HasPageNavigation; import org.zanata.webtrans.client.presenter.SourceContentsPresenter; import org.zanata.webtrans.client.resources.NavigationMessages; @@ -60,22 +58,22 @@ public class TableEditorView extends PagingScrollTable implements Tab private int cachedPages = 2; private LoadingPanel loadingPanel; - public void setFindMessage(String findMessage) + public void setFindMessage(String findMessage) { this.tableDefinition.setFindMessage(findMessage); } @Inject - public TableEditorView(NavigationMessages messages, EventBus eventBus, WorkspaceContext workspaceContext, final Resources resources, final SourceContentsPresenter sourceContentsPresenter, TargetContentsPresenter targetContentsPresenter) + public TableEditorView(NavigationMessages messages, WorkspaceContext workspaceContext, final Resources resources, final SourceContentsPresenter sourceContentsPresenter, TargetContentsPresenter targetContentsPresenter) { - this(messages, new RedirectingTableModel(), eventBus, workspaceContext, sourceContentsPresenter, targetContentsPresenter); - loadingPanel = new LoadingPanel(resources); + this(messages, new RedirectingTableModel(), workspaceContext, sourceContentsPresenter, targetContentsPresenter); + loadingPanel = new LoadingPanel(resources); loadingPanel.hide(); } - private TableEditorView(NavigationMessages messages, RedirectingTableModel tableModel, EventBus eventBus, WorkspaceContext workspaceContext, final SourceContentsPresenter sourceContentsPresenter, TargetContentsPresenter targetContentsPresenter) + private TableEditorView(NavigationMessages messages, RedirectingTableModel tableModel, WorkspaceContext workspaceContext, final SourceContentsPresenter sourceContentsPresenter, TargetContentsPresenter targetContentsPresenter) { - this(new RedirectingCachedTableModel(tableModel), new TableEditorTableDefinition(messages, new RedirectingCachedTableModel(tableModel), eventBus, sourceContentsPresenter, workspaceContext.isReadOnly(), targetContentsPresenter)); + this(new RedirectingCachedTableModel(tableModel), new TableEditorTableDefinition(messages, new RedirectingCachedTableModel(tableModel), sourceContentsPresenter, workspaceContext.isReadOnly(), targetContentsPresenter)); } private TableEditorView(RedirectingCachedTableModel tableModel, TableEditorTableDefinition tableDefinition) @@ -171,7 +169,7 @@ public void stopProcessing() } } - @Override + @Override public boolean isProcessing() { return loadingPanel.isShowing(); @@ -259,7 +257,9 @@ public int getSelectedRowNumber() @Override public TransUnit getTransUnitValue(int row) { - return getRowValue(row); + TransUnit rowValue = getRowValue(row); + Log.info("getting transunit [" + (rowValue != null) + "] on row:" + row); + return rowValue; } @Override @@ -281,38 +281,38 @@ public void setTransUnitDetails(TransUnit selectedTransUnit) * This implementation focus on element's top left corner */ public static native void scrollIntoView(Element elem) /*-{ - var left = elem.offsetLeft, top = elem.offsetTop; - var width = elem.offsetWidth, height = elem.offsetHeight; - - if (elem.parentNode != elem.offsetParent) { - left -= elem.parentNode.offsetLeft; - top -= elem.parentNode.offsetTop; - } - - var cur = elem.parentNode; - while (cur && (cur.nodeType == 1)) { - if (left + width > cur.scrollLeft + cur.clientWidth) { - cur.scrollLeft = (left + width) - cur.clientWidth; - } - if (left < cur.scrollLeft) { - cur.scrollLeft = left; - } - if (top + height > cur.scrollTop + cur.clientHeight) { - cur.scrollTop = (top + height) - cur.clientHeight; - } - if (top < cur.scrollTop) { - cur.scrollTop = top; - } - - var offsetLeft = cur.offsetLeft, offsetTop = cur.offsetTop; - if (cur.parentNode != cur.offsetParent) { - offsetLeft -= cur.parentNode.offsetLeft; - offsetTop -= cur.parentNode.offsetTop; - } - - left += offsetLeft - cur.scrollLeft; - top += offsetTop - cur.scrollTop; - cur = cur.parentNode; - } - }-*/; + var left = elem.offsetLeft, top = elem.offsetTop; + var width = elem.offsetWidth, height = elem.offsetHeight; + + if (elem.parentNode != elem.offsetParent) { + left -= elem.parentNode.offsetLeft; + top -= elem.parentNode.offsetTop; + } + + var cur = elem.parentNode; + while (cur && (cur.nodeType == 1)) { + if (left + width > cur.scrollLeft + cur.clientWidth) { + cur.scrollLeft = (left + width) - cur.clientWidth; + } + if (left < cur.scrollLeft) { + cur.scrollLeft = left; + } + if (top + height > cur.scrollTop + cur.clientHeight) { + cur.scrollTop = (top + height) - cur.clientHeight; + } + if (top < cur.scrollTop) { + cur.scrollTop = top; + } + + var offsetLeft = cur.offsetLeft, offsetTop = cur.offsetTop; + if (cur.parentNode != cur.offsetParent) { + offsetLeft -= cur.parentNode.offsetLeft; + offsetTop -= cur.parentNode.offsetTop; + } + + left += offsetLeft - cur.scrollLeft; + top += offsetTop - cur.scrollTop; + cur = cur.parentNode; + } + }-*/; } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableModelHandler.java b/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableModelHandler.java index b6f3ca84dc..5e71cc8326 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableModelHandler.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TableModelHandler.java @@ -46,4 +46,6 @@ protected boolean onRowRemoved(int row) abstract void updatePageAndRowIndex(); abstract void gotoRowInCurrentPage(int rowNum, boolean andEdit); + + abstract void gotoCurrentRow(boolean andEdit); } 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 cf906f3adf..390b87b124 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 @@ -285,6 +285,7 @@ private void moveNext(boolean forceSave) if (forceSave) { cellEditor.acceptEdit(); + cellEditor.setRowValueOverride(cellEditor.getCurrentRow(), cellEditor.getTargetCell()); } scheduler.scheduleDeferred(new Scheduler.ScheduledCommand() { @@ -316,6 +317,7 @@ private void movePrevious(boolean forceSave) if (forceSave) { cellEditor.acceptEdit(); + cellEditor.setRowValueOverride(cellEditor.getCurrentRow(), cellEditor.getTargetCell()); } scheduler.scheduleDeferred(new Scheduler.ScheduledCommand() { @@ -333,6 +335,8 @@ public void saveAsFuzzy() { Preconditions.checkState(cellEditor != null, "InlineTargetCellEditor must be set for triggering table save event"); cellEditor.acceptFuzzyEdit(); + cellEditor.setRowValueOverride(cellEditor.getCurrentRow(), cellEditor.getTargetCell()); + cellEditor.gotoCurrentRow(true); } @Override diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TransUnitsEditModel.java b/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TransUnitsEditModel.java index b7dc42e5fc..a0ce6253f4 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TransUnitsEditModel.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TransUnitsEditModel.java @@ -4,25 +4,31 @@ import org.zanata.webtrans.shared.model.TransUnit; /** - * This is mainly to abstract some methods out from InlineTargetCellEditor. - * So that other newly created class won't have to depend on ScrollPagingTable classes. + * This is mainly to abstract some methods out from InlineTargetCellEditor. So + * that other newly created class won't have to depend on ScrollPagingTable + * classes. */ -public interface TransUnitsEditModel -{ +public interface TransUnitsEditModel { - void acceptFuzzyEdit(); + void acceptFuzzyEdit(); - TransUnit getTargetCell(); + TransUnit getTargetCell(); - void gotoNewRow(NavTransUnitEvent.NavigationType nav); + void gotoNewRow(NavTransUnitEvent.NavigationType nav); - void gotoFuzzyAndNewRow(NavTransUnitEvent.NavigationType nav); + void gotoFuzzyAndNewRow(NavTransUnitEvent.NavigationType nav); - void gotoFuzzyRow(NavTransUnitEvent.NavigationType nav); + void gotoFuzzyRow(NavTransUnitEvent.NavigationType nav); - void savePendingChange(boolean cancelIfUnchanged); + void savePendingChange(boolean cancelIfUnchanged); - void saveAndMoveRow(NavTransUnitEvent.NavigationType nav); + void saveAndMoveRow(NavTransUnitEvent.NavigationType nav); - void acceptEdit(); + void acceptEdit(); + + void gotoCurrentRow(boolean andEdit); + + int getCurrentRow(); + + void setRowValueOverride(int row, TransUnit targetCell); } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TransUnitsModel.java b/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TransUnitsModel.java index 897157f1e0..4031716e49 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TransUnitsModel.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/editor/table/TransUnitsModel.java @@ -15,180 +15,162 @@ */ package org.zanata.webtrans.client.editor.table; -import java.util.ArrayList; -import java.util.Map; - -import org.zanata.common.ContentState; - -import com.allen_sauer.gwt.log.client.Log; import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; import com.google.inject.Singleton; +import org.zanata.common.ContentState; +import org.zanata.webtrans.client.editor.table.EditRowCallback; +import org.zanata.webtrans.shared.model.TransUnit; + +import java.util.List; +import java.util.ListIterator; @Singleton -public class TransUnitsModel implements EditRowCallback -{ - public static final int INIT_INDEX = 0; - private static final Predicate FUZZY_OR_NEW_PREDICATE = new Predicate() - { - @Override - public boolean apply(ContentState contentState) - { - return contentState == ContentState.New || contentState == ContentState.NeedReview; - } - }; - private static final Predicate FUZZY_PREDICATE = new Predicate() - { - @Override - public boolean apply(ContentState contentState) - { - return contentState == ContentState.NeedReview; - } - }; - private static final Predicate NEW_PREDICATE = new Predicate() - { - @Override - public boolean apply(ContentState contentState) - { - return contentState == ContentState.New; - } - }; - - private int currentIndex = INIT_INDEX; - - private Map transIdStateList; - private ArrayList idIndexList; - - public void init(Map transIdStateList, ArrayList idIndexList) - { - this.transIdStateList = transIdStateList; - this.idIndexList = idIndexList; - for (Long id : transIdStateList.keySet()) - { - Log.info("========id:" + id + ":index:" + idIndexList.indexOf(id) + ":state:" + transIdStateList.get(id)); - } - resetAllIndexes(); - } - - private void resetAllIndexes() - { - currentIndex = INIT_INDEX; - } - - @Override - public void gotoNextRow() - { - if (currentIndex < idIndexList.size() - 1) - { - currentIndex++; - } - } - - @Override - public void gotoPrevRow() - { - if (currentIndex > 0) - { - currentIndex--; - } - } - - @Override - public void gotoFirstRow() - { - currentIndex = 0; - } - - @Override - public void gotoLastRow() - { - currentIndex = idIndexList.size() - 1; - } - - @Override - public void gotoNextFuzzyNewRow() - { - moveForwardAndFind(FUZZY_OR_NEW_PREDICATE); - } - - @Override - public void gotoPrevFuzzyNewRow() - { - moveBackwardAndFind(FUZZY_OR_NEW_PREDICATE); - } - - @Override - public void gotoNextFuzzyRow() - { - moveForwardAndFind(FUZZY_PREDICATE); - } - - @Override - public void gotoPrevFuzzyRow() - { - moveBackwardAndFind(FUZZY_PREDICATE); - } - - @Override - public void gotoNextNewRow() - { - moveForwardAndFind(NEW_PREDICATE); - } - - @Override - public void gotoPrevNewRow() - { - moveBackwardAndFind(NEW_PREDICATE); - } - - private void moveForwardAndFind(Predicate condition) - { - // if (currentIndex == idIndexList.size() - 1) - // { - // // end of list - // return; - // } - // int nextIndex = currentIndex + 1; - // // ListIterator iterator = - // transUnits.listIterator(nextIndex); - // - // for (Long id : transIdStateList.keySet()) - // { - // if (condition.apply(transIdStateList.get(id))) - // { - // - // } - // } - } - - private void moveBackwardAndFind(Predicate condition) - { -// ListIterator iterator = transUnits.listIterator(currentIndex); - // int prevIndex = currentIndex; - // while (iterator.hasPrevious()) - // { - // TransUnit transUnit = iterator.previous(); - // prevIndex--; - // if (condition.apply(transUnit)) - // { - // currentIndex = prevIndex; - // break; - // } - // } - } - - public int getCurrentIndex() - { - return currentIndex; - } - - public boolean moveToIndex(int rowIndex) - { - if (rowIndex < 0 || rowIndex >= idIndexList.size()) - { - return false; - } - boolean moved = rowIndex != currentIndex; - currentIndex = rowIndex; - return moved; - } +public class TransUnitsModel implements EditRowCallback { + public static final int INIT_INDEX = 0; + private static final Predicate FUZZY_OR_NEW_PREDICATE = new Predicate() { + @Override + public boolean apply(TransUnit transUnit) { + return transUnit.getStatus() == ContentState.New || transUnit.getStatus() == ContentState.NeedReview; + } + }; + private static final Predicate FUZZY_PREDICATE = new Predicate() { + @Override + public boolean apply(TransUnit transUnit) { + return transUnit.getStatus() == ContentState.NeedReview; + } + }; + private static final Predicate NEW_PREDICATE = new Predicate() { + @Override + public boolean apply(TransUnit transUnit) { + return transUnit.getStatus() == ContentState.New; + } + }; + + private int currentIndex = INIT_INDEX; + private List transUnits = Lists.newArrayList(); + + public void setTransUnits(List newTransUnits) { + this.transUnits = ImmutableList.copyOf(newTransUnits); + resetAllIndexes(); + } + + private void resetAllIndexes() { + currentIndex = INIT_INDEX; + } + + @Override + public void gotoNextRow() { + if (currentIndex < transUnits.size() - 1) { + currentIndex++; + } + } + + @Override + public void gotoPrevRow() { + if (currentIndex > 0) { + currentIndex--; + } + } + + @Override + public void gotoFirstRow() { + currentIndex = 0; + } + + @Override + public void gotoLastRow() { + currentIndex = transUnits.size() - 1; + } + + @Override + public void gotoNextFuzzyNewRow() { + moveForwardAndFind(FUZZY_OR_NEW_PREDICATE); + } + + @Override + public void gotoPrevFuzzyNewRow() { + moveBackwardAndFind(FUZZY_OR_NEW_PREDICATE); + } + + @Override + public void gotoNextFuzzyRow() { + moveForwardAndFind(FUZZY_PREDICATE); + } + + @Override + public void gotoPrevFuzzyRow() { + moveBackwardAndFind(FUZZY_PREDICATE); + } + + @Override + public void gotoNextNewRow() { + moveForwardAndFind(NEW_PREDICATE); + } + + @Override + public void gotoCurrentRow(boolean andEdit) { + moveToIndex(currentIndex); + } + + @Override + public void gotoPrevNewRow() { + moveBackwardAndFind(NEW_PREDICATE); + } + + private void moveForwardAndFind(Predicate condition) { + if (currentIndex == transUnits.size() - 1) { + //end of list + return; + } + int nextIndex = currentIndex + 1; + ListIterator iterator = transUnits.listIterator(nextIndex); + while(iterator.hasNext()) { + TransUnit next = iterator.next(); + if (condition.apply(next)) { + currentIndex = nextIndex; + break; + } + nextIndex++; + } + } + + private void moveBackwardAndFind(Predicate condition) { + ListIterator iterator = transUnits.listIterator(currentIndex); + int prevIndex = currentIndex; + while(iterator.hasPrevious()) { + TransUnit transUnit = iterator.previous(); + prevIndex--; + if (condition.apply(transUnit)) { + currentIndex = prevIndex; + break; + } + } + } + + public TransUnit getCurrentTransUnit() { + if (currentIndex >= transUnits.size()) { + throw new RuntimeException("current index is out of bound."); + } + return transUnits.get(currentIndex); + } + + public List getTransUnits() { + return transUnits; + } + + public boolean moveToIndex(int rowIndex) { + if (rowIndex < 0 || rowIndex >= transUnits.size()) { + return false; + } + boolean moved = rowIndex != currentIndex; + currentIndex = rowIndex; + return moved; + } + + @Override + public void setRowValueOverride(int row, TransUnit targetCell) { + + } } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/GetTransUnitNavigationHandler.java b/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/GetTransUnitNavigationHandler.java index 3e83721ae6..aac3c20bca 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/GetTransUnitNavigationHandler.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/server/rpc/GetTransUnitNavigationHandler.java @@ -25,6 +25,7 @@ import java.util.List; import java.util.Set; +import lombok.extern.slf4j.Slf4j; import net.customware.gwt.dispatch.server.ExecutionContext; import net.customware.gwt.dispatch.shared.ActionException; @@ -50,11 +51,10 @@ @Name("webtrans.gwt.GetTransUnitNavigationHandler") @Scope(ScopeType.STATELESS) @ActionHandlerFor(GetTransUnitsNavigation.class) +@Slf4j public class GetTransUnitNavigationHandler extends AbstractActionHandler { - @Logger - Log log; @In private TextFlowDAO textFlowDAO; @@ -112,6 +112,7 @@ public GetTransUnitsNavigationResult execute(GetTransUnitsNavigation action, Exe } } + return new GetTransUnitsNavigationResult(new DocumentId(action.getId()), idIndexList, transIdStateList); } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/shared/model/TransUnit.java b/zanata-war/src/main/java/org/zanata/webtrans/shared/model/TransUnit.java index 1b0a083369..c4de67d228 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/shared/model/TransUnit.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/shared/model/TransUnit.java @@ -61,6 +61,23 @@ private TransUnit(TransUnitId id, String resId, LocaleId localeId, boolean plura this.verNum = verNum; } + public void OverrideWith(TransUnit obj){ + this.id = obj.getId(); + this.resId = obj.getResId(); + this.localeId = obj.getLocaleId(); + this.plural = obj.isPlural(); + this.sources = obj.getSources(); + this.sourceComment = obj.getSourceComment(); + this.targets = obj.getTargets(); + this.status = obj.getStatus(); + this.lastModifiedBy = obj.getLastModifiedBy(); + this.lastModifiedTime = obj.getLastModifiedTime(); + this.msgContext = obj.getMsgContext(); + this.rowIndex = obj.getRowIndex(); + this.verNum = obj.getVerNum(); + + } + public TransUnitId getId() { return id; @@ -177,7 +194,7 @@ public Integer getVerNum() return verNum; } - void setVerNum(Integer verNum) + public void setVerNum(Integer verNum) { this.verNum = verNum; }