From 1fe8483a38aa89c7a64febcb282225931c614314 Mon Sep 17 00:00:00 2001 From: David Mason Date: Tue, 6 Dec 2011 17:59:55 +1000 Subject: [PATCH] add defaults to history token, needs debugging --- .../webtrans/client/history/HistoryToken.java | 140 ++++++++++-------- .../client/presenter/AppPresenter.java | 44 ++---- .../presenter/DocumentListPresenter.java | 105 +++---------- 3 files changed, 113 insertions(+), 176 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 9e1ee2a604..2654d12536 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,13 +12,14 @@ */ 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"; @@ -27,14 +28,29 @@ public class HistoryToken public static final String VALUE_DOC_FILTER_EXACT = "exact"; public static final String VALUE_DOC_FILTER_INEXACT = "substr"; - private AppPresenter.Display.MainView view = null; - private String fullDocPath = null; - private Boolean docFilterExact = null; - private String docFilterText = null; + // 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; + public HistoryToken() + { + view = DEFAULT_VIEW; + fullDocPath = DEFAULT_DOCUMENT_PATH; + docFilterText = DEFAULT_DOC_FILTER_TEXT; + docFilterExact = DEFAULT_DOC_FILTER_EXACT; + } /** - * Generate a history token from the given token string + * 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. * * @param token A GWT history token in the form key1:value1,key2:value2,... */ @@ -54,46 +70,25 @@ public static HistoryToken fromTokenString(String token) if (key == HistoryToken.KEY_DOCUMENT) { - try - { + if (value != null && value.length() > 0) 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 if (value.equals(VALUE_DOCLIST_VIEW)) - { - historyToken.setView(AppPresenter.Display.MainView.Documents); - } - else - { // invalid view - historyToken.setView(null); - } + // else assume document list + } + else if (key == HistoryToken.KEY_DOC_FILTER_TEXT) + { + if (value != null && value.length() > 0) + historyToken.setDocFilterText(value); } 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); @@ -107,13 +102,14 @@ else if (key == HistoryToken.KEY_DOC_FILTER_TEXT) return historyToken; } - public boolean hasDocumentPath() - { - return fullDocPath != null && fullDocPath.length() > 0; - } - + /** + * + * @return the document path, may be an empty string, will not be null + */ public String getDocumentPath() { + if (fullDocPath == null) + return DEFAULT_DOCUMENT_PATH; return fullDocPath; } @@ -122,13 +118,14 @@ public void setDocumentPath(String fullDocPath) this.fullDocPath = fullDocPath; } - public boolean hasView() - { - return view != null; - } - + /** + * + * @return the current view, will never return null + */ public AppPresenter.Display.MainView getView() { + if (view == null) + return DEFAULT_VIEW; return view; } @@ -137,28 +134,29 @@ public void setView(AppPresenter.Display.MainView view) this.view = view; } - public boolean hasDocFilterExact() - { - return docFilterExact != null; - } - - public Boolean getDocFilterExact() + /** + * + * @return true if document filter should accept only an exact match + */ + public boolean getDocFilterExact() { return docFilterExact; } - public void setDocFilterExact(Boolean exactMatch) + public void setDocFilterExact(boolean exactMatch) { docFilterExact = exactMatch; } - public boolean hasDocFilterText() - { - return docFilterText != null; - } - + /** + * + * @return the string against which to filter the document list. May be an + * empty string, will never be null. + */ public String getDocFilterText() { + if (docFilterText == null) + return DEFAULT_DOC_FILTER_TEXT; return docFilterText; } @@ -169,6 +167,9 @@ 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} */ @@ -177,43 +178,41 @@ public String toTokenString() String token = ""; boolean first = true; - if (hasView()) + if (getView() != DEFAULT_VIEW) { 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 (hasDocumentPath()) + if (!getDocumentPath().equals(DEFAULT_DOCUMENT_PATH)) { if (first) first = false; else token += PAIR_SEPARATOR; - token += KEY_DOCUMENT + DELIMITER_K_V + fullDocPath.toString(); + token += KEY_DOCUMENT + DELIMITER_K_V + fullDocPath; } - if (hasDocFilterExact()) + if (getDocFilterExact() != DEFAULT_DOC_FILTER_EXACT) { 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 (hasDocFilterText()) + if (!getDocFilterText().equals(DEFAULT_DOC_FILTER_TEXT)) { if (first) first = false; @@ -224,4 +223,15 @@ else if (view == AppPresenter.Display.MainView.Documents) 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 f472ce89ea..6ba5b0bc07 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,6 +143,9 @@ 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 @@ -319,30 +322,20 @@ 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 (token.hasDocumentPath() && (selectedDocument == null || !selectedDocument.getId().equals(docId))) + if (docId != null && (selectedDocument == null || !selectedDocument.getId().equals(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()); + Log.info("Firing document selection event for document " + docId.getId()); + eventBus.fireEvent(new DocumentSelectionEvent(docId)); } - if (token.hasView() && token.getView() != display.getCurrentView()) + + if (token.getView() != currentHistoryState.getView()) { if (display.getCurrentView().equals(MainView.Editor)) { @@ -357,27 +350,20 @@ 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); - } - // 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) + currentHistoryState = token; // update toggle link with alternate view latest history state - if (token.hasView() && token.getView().equals(MainView.Editor)) + HistoryToken toggleToken = (HistoryToken) token.clone(); + if (toggleToken.getView().equals(MainView.Editor)) { - token.setView(MainView.Documents); + toggleToken.setView(MainView.Documents); } else - { // doclist is default - token.setView(MainView.Editor); + { + toggleToken.setView(MainView.Editor); } - ((Anchor) display.getDocumentsLink()).setHref("#" + token.toTokenString()); - + ((Anchor) display.getDocumentsLink()).setHref("#" + toggleToken.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 3a393f7d35..24a02aa75f 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,25 +134,8 @@ public void onSelection(SelectionEvent event) HistoryToken token = HistoryToken.fromTokenString(History.getToken()); // prevent feedback loops between history and selection - 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) + DocumentId docId = getDocumentId(token.getDocumentPath()); + if (event.getSelectedItem().getId().equals(docId)) { currentDocument = event.getSelectedItem(); token.setDocumentPath(event.getSelectedItem().getPath() + event.getSelectedItem().getName()); @@ -183,7 +166,7 @@ public void onDocumentSelected(DocumentSelectionEvent event) public void onValueChange(ValueChangeEvent event) { HistoryToken token = HistoryToken.fromTokenString(History.getToken()); - if (event.getValue() != token.getDocFilterText()) + if (!token.getDocFilterText().equals(event.getValue())) { token.setDocFilterText(event.getValue()); History.newItem(token.toTokenString()); @@ -211,72 +194,30 @@ public void onValueChange(ValueChangeEvent event) @Override public void onValueChange(ValueChangeEvent event) { - boolean filterChanged = false; HistoryToken token = HistoryToken.fromTokenString(event.getValue()); - 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 - } + // 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()); currentHistoryState = token; - if (filterChanged) + if (patternChanged || flagChanged) runFilter(); } });