From 5c9fdfe5bc1995e012cf8b1025a95f364b6528a2 Mon Sep 17 00:00:00 2001 From: David Mason Date: Fri, 9 Dec 2011 13:53:44 +1000 Subject: [PATCH] Revert "add defaults to history token, needs debugging" it was too buggy, did it more carefully in another branch that will be merged after this revert. This reverts commit 1fe8483a38aa89c7a64febcb282225931c614314. --- .../webtrans/client/history/HistoryToken.java | 140 ++++++++---------- .../client/presenter/AppPresenter.java | 44 ++++-- .../presenter/DocumentListPresenter.java | 105 ++++++++++--- 3 files changed, 176 insertions(+), 113 deletions(-) diff --git a/server/zanata-war/src/main/java/org/zanata/webtrans/client/history/HistoryToken.java b/server/zanata-war/src/main/java/org/zanata/webtrans/client/history/HistoryToken.java index 2654d12536..9e1ee2a604 100644 --- a/server/zanata-war/src/main/java/org/zanata/webtrans/client/history/HistoryToken.java +++ b/server/zanata-war/src/main/java/org/zanata/webtrans/client/history/HistoryToken.java @@ -12,14 +12,13 @@ */ public class HistoryToken { - private static final String DELIMITER_K_V = ":"; private static final String PAIR_SEPARATOR = ";"; public static final String KEY_DOCUMENT = "doc"; public static final String KEY_VIEW = "view"; - // public static final String VALUE_DOCLIST_VIEW = "list"; + public static final String VALUE_DOCLIST_VIEW = "list"; public static final String VALUE_EDITOR_VIEW = "doc"; public static final String KEY_DOC_FILTER_TEXT = "filter"; @@ -28,29 +27,14 @@ public class HistoryToken public static final String VALUE_DOC_FILTER_EXACT = "exact"; public static final String VALUE_DOC_FILTER_INEXACT = "substr"; - // defaults - private static final String DEFAULT_DOCUMENT_PATH = ""; - private static final String DEFAULT_DOC_FILTER_TEXT = ""; - private static final boolean DEFAULT_DOC_FILTER_EXACT = false; - private static final AppPresenter.Display.MainView DEFAULT_VIEW = AppPresenter.Display.MainView.Documents; - - private AppPresenter.Display.MainView view; - private String fullDocPath; - private boolean docFilterExact; - private String docFilterText; + private AppPresenter.Display.MainView view = null; + private String fullDocPath = null; + private Boolean docFilterExact = null; + private String docFilterText = null; - public HistoryToken() - { - view = DEFAULT_VIEW; - fullDocPath = DEFAULT_DOCUMENT_PATH; - docFilterText = DEFAULT_DOC_FILTER_TEXT; - docFilterExact = DEFAULT_DOC_FILTER_EXACT; - } /** - * Generates a history token from the given token string. Default values will - * be used for any keys that are not present or do not have a valid value - * associated with them. + * Generate a history token from the given token string * * @param token A GWT history token in the form key1:value1,key2:value2,... */ @@ -70,25 +54,46 @@ public static HistoryToken fromTokenString(String token) if (key == HistoryToken.KEY_DOCUMENT) { - if (value != null && value.length() > 0) + try + { historyToken.setDocumentPath((value)); + } + catch (NullPointerException e) + { + historyToken.setDocumentPath(null); + } + catch (NumberFormatException e) + { + historyToken.setDocumentPath(null); + } } else if (key == HistoryToken.KEY_VIEW) { if (value.equals(VALUE_EDITOR_VIEW)) + { historyToken.setView(AppPresenter.Display.MainView.Editor); - // else assume document list - } - else if (key == HistoryToken.KEY_DOC_FILTER_TEXT) - { - if (value != null && value.length() > 0) - historyToken.setDocFilterText(value); + } + else if (value.equals(VALUE_DOCLIST_VIEW)) + { + historyToken.setView(AppPresenter.Display.MainView.Documents); + } + else + { // invalid view + historyToken.setView(null); + } } else if (key == HistoryToken.KEY_DOC_FILTER_OPTION) { if (value == VALUE_DOC_FILTER_EXACT) historyToken.setDocFilterExact(true); + else if (value == VALUE_DOC_FILTER_INEXACT) + historyToken.setDocFilterExact(false); } + else if (key == HistoryToken.KEY_DOC_FILTER_TEXT) + { + historyToken.setDocFilterText(value); + } + else Log.info("unrecognised history key: " + key); @@ -102,14 +107,13 @@ else if (key == HistoryToken.KEY_DOC_FILTER_OPTION) return historyToken; } - /** - * - * @return the document path, may be an empty string, will not be null - */ + public boolean hasDocumentPath() + { + return fullDocPath != null && fullDocPath.length() > 0; + } + public String getDocumentPath() { - if (fullDocPath == null) - return DEFAULT_DOCUMENT_PATH; return fullDocPath; } @@ -118,14 +122,13 @@ public void setDocumentPath(String fullDocPath) this.fullDocPath = fullDocPath; } - /** - * - * @return the current view, will never return null - */ + public boolean hasView() + { + return view != null; + } + public AppPresenter.Display.MainView getView() { - if (view == null) - return DEFAULT_VIEW; return view; } @@ -134,29 +137,28 @@ public void setView(AppPresenter.Display.MainView view) this.view = view; } - /** - * - * @return true if document filter should accept only an exact match - */ - public boolean getDocFilterExact() + public boolean hasDocFilterExact() + { + return docFilterExact != null; + } + + public Boolean getDocFilterExact() { return docFilterExact; } - public void setDocFilterExact(boolean exactMatch) + public void setDocFilterExact(Boolean exactMatch) { docFilterExact = exactMatch; } - /** - * - * @return the string against which to filter the document list. May be an - * empty string, will never be null. - */ + public boolean hasDocFilterText() + { + return docFilterText != null; + } + public String getDocFilterText() { - if (docFilterText == null) - return DEFAULT_DOC_FILTER_TEXT; return docFilterText; } @@ -167,9 +169,6 @@ public void setDocFilterText(String value) /** - * Generates a token string to represent this {@link HistoryToken}. Fields - * that have their default value are not included in the string. - * * @return a token string for use with * {@link com.google.gwt.user.client.History} */ @@ -178,41 +177,43 @@ public String toTokenString() String token = ""; boolean first = true; - if (getView() != DEFAULT_VIEW) + if (hasView()) { if (first) first = false; else token += PAIR_SEPARATOR; token += KEY_VIEW + DELIMITER_K_V; - // this conditional is unnecessary if (view == AppPresenter.Display.MainView.Editor) { token += VALUE_EDITOR_VIEW; } + else if (view == AppPresenter.Display.MainView.Documents) + { + token += VALUE_DOCLIST_VIEW; + } } - if (!getDocumentPath().equals(DEFAULT_DOCUMENT_PATH)) + if (hasDocumentPath()) { if (first) first = false; else token += PAIR_SEPARATOR; - token += KEY_DOCUMENT + DELIMITER_K_V + fullDocPath; + token += KEY_DOCUMENT + DELIMITER_K_V + fullDocPath.toString(); } - if (getDocFilterExact() != DEFAULT_DOC_FILTER_EXACT) + if (hasDocFilterExact()) { if (first) first = false; else token += PAIR_SEPARATOR; token += KEY_DOC_FILTER_OPTION + DELIMITER_K_V; - // this is redundant if defaults don't change token += docFilterExact ? VALUE_DOC_FILTER_EXACT : VALUE_DOC_FILTER_INEXACT; } - if (!getDocFilterText().equals(DEFAULT_DOC_FILTER_TEXT)) + if (hasDocFilterText()) { if (first) first = false; @@ -223,15 +224,4 @@ public String toTokenString() return token; } - - public Object clone() - { - HistoryToken newToken = new HistoryToken(); - newToken.view = this.view; - newToken.fullDocPath = this.fullDocPath; - newToken.docFilterText = this.docFilterText; - newToken.docFilterExact = this.docFilterExact; - - return newToken; - } } diff --git a/server/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/AppPresenter.java b/server/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/AppPresenter.java index 6ba5b0bc07..f472ce89ea 100644 --- a/server/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/AppPresenter.java +++ b/server/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/AppPresenter.java @@ -143,9 +143,6 @@ enum StatsType private final TranslationStats selectedDocumentStats = new TranslationStats(); private final TranslationStats projectStats = new TranslationStats(); - // used to determine whether history state has changed - private HistoryToken currentHistoryState = null; - private static final String WORKSPACE_TITLE_QUERY_PARAMETER_KEY = "title"; @Inject @@ -322,20 +319,30 @@ private void adjustStats(TranslationStats statsObject, TransUnitUpdatedEvent Upd private void processHistoryEvent(ValueChangeEvent event) { + + // TODO keep track of previous history token like in DocumentListPresenter + Log.info("Responding to history token: " + event.getValue()); HistoryToken token = HistoryToken.fromTokenString(event.getValue()); DocumentId docId = documentListPresenter.getDocumentId(token.getDocumentPath()); - if (docId != null && (selectedDocument == null || !selectedDocument.getId().equals(docId))) + if (token.hasDocumentPath() && (selectedDocument == null || !selectedDocument.getId().equals(docId))) { - Log.info("Firing document selection event for document " + docId.getId()); - eventBus.fireEvent(new DocumentSelectionEvent(docId)); + Log.info("Firing document selection event"); + try + { + eventBus.fireEvent(new DocumentSelectionEvent(docId)); + } + catch (Throwable t) + { + Log.info("got exception from document selection event", t); + } + Log.info("Fired document selection event for " + docId.getId()); } - - if (token.getView() != currentHistoryState.getView()) + if (token.hasView() && token.getView() != display.getCurrentView()) { if (display.getCurrentView().equals(MainView.Editor)) { @@ -350,20 +357,27 @@ private void processHistoryEvent(ValueChangeEvent event) } display.showInMainView(token.getView()); } + // TODO set defaults in history rather than having this block. + else if (!token.hasView()) + { + // default view. + display.showInMainView(MainView.Documents); + } - currentHistoryState = token; + // TODO use a cloned token below when the current token is stored. Ok to + // modify current token for now. (add clone method when doing this) // update toggle link with alternate view latest history state - HistoryToken toggleToken = (HistoryToken) token.clone(); - if (toggleToken.getView().equals(MainView.Editor)) + if (token.hasView() && token.getView().equals(MainView.Editor)) { - toggleToken.setView(MainView.Documents); + token.setView(MainView.Documents); } else - { - toggleToken.setView(MainView.Editor); + { // doclist is default + token.setView(MainView.Editor); } - ((Anchor) display.getDocumentsLink()).setHref("#" + toggleToken.toTokenString()); + ((Anchor) display.getDocumentsLink()).setHref("#" + token.toTokenString()); + } } diff --git a/server/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/DocumentListPresenter.java b/server/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/DocumentListPresenter.java index 24a02aa75f..3a393f7d35 100644 --- a/server/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/DocumentListPresenter.java +++ b/server/zanata-war/src/main/java/org/zanata/webtrans/client/presenter/DocumentListPresenter.java @@ -134,8 +134,25 @@ public void onSelection(SelectionEvent event) HistoryToken token = HistoryToken.fromTokenString(History.getToken()); // prevent feedback loops between history and selection - DocumentId docId = getDocumentId(token.getDocumentPath()); - if (event.getSelectedItem().getId().equals(docId)) + boolean isNewSelection; + if (token.hasDocumentPath()) + { + try + { + isNewSelection = event.getSelectedItem().getId().getId() != getDocumentId(token.getDocumentPath()).getId(); + } + catch (Throwable t) + { + Log.info("got exception determining whether selection is new", t); + isNewSelection = false; + } + } + else + { + isNewSelection = true; + } + + if (isNewSelection) { currentDocument = event.getSelectedItem(); token.setDocumentPath(event.getSelectedItem().getPath() + event.getSelectedItem().getName()); @@ -166,7 +183,7 @@ public void onDocumentSelected(DocumentSelectionEvent event) public void onValueChange(ValueChangeEvent event) { HistoryToken token = HistoryToken.fromTokenString(History.getToken()); - if (!token.getDocFilterText().equals(event.getValue())) + if (event.getValue() != token.getDocFilterText()) { token.setDocFilterText(event.getValue()); History.newItem(token.toTokenString()); @@ -194,30 +211,72 @@ public void onValueChange(ValueChangeEvent event) @Override public void onValueChange(ValueChangeEvent event) { + boolean filterChanged = false; HistoryToken token = HistoryToken.fromTokenString(event.getValue()); - // update textbox to match new history state - if (!token.getDocFilterText().equals(display.getFilterTextBox().getValue())) - display.getFilterTextBox().setValue(token.getDocFilterText(), true); - - boolean patternChanged = true; - if (currentHistoryState != null) - patternChanged = !token.getDocFilterText().equals(currentHistoryState.getDocFilterText()); - if (patternChanged) - filter.setPattern(token.getDocFilterText()); - - // update checkbox to match new history state - if (token.getDocFilterExact() != display.getExactSearchCheckbox().getValue()) - display.getExactSearchCheckbox().setValue(token.getDocFilterExact()); - - boolean flagChanged = true; - if (currentHistoryState != null) - flagChanged = token.getDocFilterExact() != currentHistoryState.getDocFilterExact(); - if (flagChanged) - filter.setFullText(token.getDocFilterExact()); + if (token.hasDocFilterText()) + { + // update textbox to match new history state + if (!token.getDocFilterText().equals(display.getFilterTextBox().getValue())) + { + display.getFilterTextBox().setValue(token.getDocFilterText(), true); + } + + boolean patternChanged; + if (currentHistoryState == null) + patternChanged = true; + else + patternChanged = !token.getDocFilterText().equals(currentHistoryState.getDocFilterText()); + if (patternChanged) + { + filter.setPattern(token.getDocFilterText()); + filterChanged = true; + } + } + else + { + if (currentHistoryState != null && currentHistoryState.hasDocFilterText()) + { + // not using default + filter.setPattern(""); + filterChanged = true; + } + // else was already using blank filter + } + + if (token.hasDocFilterExact()) + { + // update checkbox to match new history state + if (token.getDocFilterExact() != display.getExactSearchCheckbox().getValue()) + { + display.getExactSearchCheckbox().setValue(token.getDocFilterExact()); + } + + boolean flagChanged; + if (currentHistoryState == null) + flagChanged = true; + else + flagChanged = !token.getDocFilterExact().equals(currentHistoryState.getDocFilterExact()); + + if (flagChanged) + { + filter.setFullText(token.getDocFilterExact()); + filterChanged = true; + } + } + else + { + if (currentHistoryState != null && currentHistoryState.hasDocFilterExact() && currentHistoryState.getDocFilterExact() == true) + { + // not using default + filter.setFullText(false); + filterChanged = true; + } + // else was already using substring match + } currentHistoryState = token; - if (patternChanged || flagChanged) + if (filterChanged) runFilter(); } });