From ca02ba4fb45c24b43be2ae910ceefb34b338c677 Mon Sep 17 00:00:00 2001 From: Patrick Huang Date: Fri, 11 May 2012 16:48:25 +1000 Subject: [PATCH 1/4] bug 816843 - restrict query result to have distinct records --- .../main/java/org/zanata/model/HTextFlow.java | 2 ++ .../org/zanata/model/HTextFlowTarget.java | 21 +++++++++---------- .../main/java/org/zanata/dao/TextFlowDAO.java | 2 ++ .../editor/table/TableEditorPresenter.java | 4 +++- .../client/editor/table/TableEditorView.java | 4 +++- .../rpc/GetTransUnitNavigationHandler.java | 13 ++++++------ 6 files changed, 27 insertions(+), 19 deletions(-) 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 2784ad25d2..02ef88130c 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, int offset, bo { 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"); if (reverse) 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 3da58d33f6..178969a803 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 @@ -811,15 +811,17 @@ private void cacheNextState(final NavigationCacheCallback callBack, final List { - @Logger - Log log; @In private TextFlowDAO textFlowDAO; @@ -79,9 +79,9 @@ public GetTransUnitsNavigationResult execute(GetTransUnitsNavigation action, Exe ArrayList results = new ArrayList(); if (action.getPhrase() != null && !action.getPhrase().isEmpty()) { - log.info("find message:" + action.getPhrase()); + log.info("find message: {}", action.getPhrase()); Set idSet = textFlowDAO.getNavigationBy(tf.getDocument().getId(), action.getPhrase().toLowerCase(), tf.getPos(), action.getWorkspaceId().getLocaleId(), action.isReverse()); - log.info("size: " + idSet.size()); + log.info("size: {}", idSet.size()); Long step = 0L; int count = 0; @@ -96,7 +96,7 @@ public GetTransUnitsNavigationResult execute(GetTransUnitsNavigation action, Exe if (checkStateAndValidate(action.isNewState(), action.isFuzzyState(), textFlowTarget)) { results.add(step); - log.info("add navigation step: " + step); + log.info("add navigation step: {}", step); count++; } } @@ -108,6 +108,7 @@ public GetTransUnitsNavigationResult execute(GetTransUnitsNavigation action, Exe } else { + log.info("get navigation by textFlow pos: {}, reverse: {}", tf.getPos(), action.isReverse()); List textFlows = textFlowDAO.getNavigationByDocumentId(tf.getDocument().getId(), tf.getPos(), action.isReverse()); int count = 0; Long step = 0L; @@ -121,7 +122,7 @@ public GetTransUnitsNavigationResult execute(GetTransUnitsNavigation action, Exe if (checkStateAndValidate(action.isNewState(), action.isFuzzyState(), textFlowTarget)) { results.add(step); - log.info("add navigation step: " + step); + log.info("add navigation step: {}", step); count++; } } From 1a9846a12ca5f4ebd9a49894afcd41e5e8aa2587 Mon Sep 17 00:00:00 2001 From: Patrick Huang Date: Mon, 14 May 2012 09:30:09 +1000 Subject: [PATCH 2/4] Bug fix for 787064 and 816843 - Bug 787064 - Alt+PageUp and Alt+PageDown shortcuts don't work when editor is not focused - Bug 816843 - [WebTran] Next and Previous Fuzzy/Untranslated keyboard short cut does not work --- .../client/editor/table/TableEditorPresenter.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) 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 178969a803..a26d523b08 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 @@ -811,13 +811,13 @@ private void cacheNextState(final NavigationCacheCallback callBack, final List transIdPrevCache, boolean isNewState, bool if (transIdPrevCache.isEmpty()) { if (isReqComplete) + { cachePrevState(cacheCallback, transIdPrevCache, isNewState, isFuzzyState); + } } else { @@ -940,9 +943,9 @@ private void gotoPrevState(List transIdPrevCache, boolean isNewState, bool int offset = transIdPrevCache.get(size - 1).intValue(); if (curRowIndex > offset) { - for (int i = 0; i < size; i++) + for (Long aTransIdPrevCache : transIdPrevCache) { - int newRowIndex = transIdPrevCache.get(i).intValue(); + int newRowIndex = aTransIdPrevCache.intValue(); if (curRowIndex > newRowIndex) { display.getTargetCellEditor().cancelEdit(); @@ -965,7 +968,9 @@ private void gotoNextState(List transIdNextCache, boolean isNewState, bool if (transIdNextCache.isEmpty()) { if (isReqComplete) + { cacheNextState(cacheCallback, transIdNextCache, isNewState, isFuzzyState); + } } else { @@ -973,9 +978,9 @@ private void gotoNextState(List transIdNextCache, boolean isNewState, bool int offset = transIdNextCache.get(size - 1).intValue(); if (curRowIndex < offset) { - for (int i = 0; i < size; i++) + for (Long aTransIdNextCache : transIdNextCache) { - int newRowIndex = transIdNextCache.get(i).intValue(); + int newRowIndex = aTransIdNextCache.intValue(); if (curRowIndex < newRowIndex) { display.getTargetCellEditor().cancelEdit(); From 5f00cf823473cd48753287251322ec81ca5110c1 Mon Sep 17 00:00:00 2001 From: Alex Eng Date: Mon, 14 May 2012 15:23:04 +1000 Subject: [PATCH 3/4] work in progress: fixing bug: https://bugzilla.redhat.com/show_bug.cgi?id=815631 --- .../client/editor/table/EditRowCallback.java | 6 + .../editor/table/InlineTargetCellEditor.java | 630 +++++++++--------- .../table/RedirectingCachedTableModel.java | 7 +- .../editor/table/RedirectingTableModel.java | 6 + .../editor/table/TableEditorPresenter.java | 56 +- .../table/TableEditorTableDefinition.java | 14 +- .../client/editor/table/TableEditorView.java | 77 ++- .../editor/table/TableModelHandler.java | 2 + .../editor/table/TargetContentsPresenter.java | 4 + .../editor/table/TransUnitsEditModel.java | 30 +- .../client/editor/table/TransUnitsModel.java | 10 + .../webtrans/shared/model/TransUnit.java | 19 +- 12 files changed, 458 insertions(+), 403 deletions(-) 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..e2eb7c9ff1 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 @@ -38,334 +38,304 @@ 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 a26d523b08..c93455e69c 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; @@ -340,25 +342,32 @@ public void onTransUnitUpdated(TransUnitUpdatedEvent event) { // Clear the cache clearCacheList(); - 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()); + // - 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(); + } } } } @@ -389,7 +398,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 @@ -651,7 +661,7 @@ public void onSuccess(UpdateTransUnitResult result) eventBus.fireEvent(new NotificationEvent(Severity.Info, messages.notifyUpdateSaved())); } }); - stopEditing(rowValue); + // stopEditing(rowValue); return true; } @@ -704,6 +714,13 @@ public void gotoLastRow() gotoRow(display.getTableModel().getRowCount() - 1, true); } + @Override + public void gotoCurrentRow(boolean andEdit) + { + updatePageAndRowIndex(); + gotoRow(curRowIndex, andEdit); + } + @Override public void nextFuzzyNewIndex() { @@ -787,7 +804,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")); } 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..808859dc53 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 @@ -116,7 +116,8 @@ public void renderRowValue(final TransUnit rowValue, ColumnDefinition implements Tab private int cachedPages = 2; private LoadingPanel loadingPanel; - public void setFindMessage(String findMessage) + public void setFindMessage(String findMessage) { this.tableDefinition.setFindMessage(findMessage); } @@ -68,8 +67,8 @@ public void setFindMessage(String findMessage) @Inject public TableEditorView(NavigationMessages messages, EventBus eventBus, 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(), eventBus, workspaceContext, sourceContentsPresenter, targetContentsPresenter); + loadingPanel = new LoadingPanel(resources); loadingPanel.hide(); } @@ -171,7 +170,7 @@ public void stopProcessing() } } - @Override + @Override public boolean isProcessing() { return loadingPanel.isShowing(); @@ -283,38 +282,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 ac166fa0a8..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 @@ -109,6 +109,11 @@ public void gotoNextNewRow() { moveForwardAndFind(NEW_PREDICATE); } + @Override + public void gotoCurrentRow(boolean andEdit) { + moveToIndex(currentIndex); + } + @Override public void gotoPrevNewRow() { moveBackwardAndFind(NEW_PREDICATE); @@ -163,4 +168,9 @@ public boolean moveToIndex(int rowIndex) { currentIndex = rowIndex; return moved; } + + @Override + public void setRowValueOverride(int row, TransUnit targetCell) { + + } } 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; } From 829a432d880fecc6c712df23286e141440d40e56 Mon Sep 17 00:00:00 2001 From: Alex Eng Date: Mon, 14 May 2012 15:52:32 +1000 Subject: [PATCH 4/4] Clean up unused event bus --- .../client/editor/table/InlineTargetCellEditor.java | 1 - .../editor/table/TableEditorTableDefinition.java | 6 +----- .../webtrans/client/editor/table/TableEditorView.java | 11 +++++------ 3 files changed, 6 insertions(+), 12 deletions(-) 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 e2eb7c9ff1..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,7 +35,6 @@ 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, 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 808859dc53..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); 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 6bd9a2e8a3..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; @@ -33,6 +31,7 @@ import org.zanata.webtrans.shared.model.TransUnit; import org.zanata.webtrans.shared.model.WorkspaceContext; +import com.allen_sauer.gwt.log.client.Log; import com.google.gwt.dom.client.Element; import com.google.gwt.event.logical.shared.HasSelectionHandlers; import com.google.gwt.event.logical.shared.SelectionEvent; @@ -65,16 +64,16 @@ public void setFindMessage(String 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); + 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)