Package org.zanata.webtrans.client.presenter

Source Code of org.zanata.webtrans.client.presenter.TranslationHistoryPresenter

package org.zanata.webtrans.client.presenter;

import java.util.Collections;
import java.util.Date;
import java.util.List;

import org.zanata.webtrans.client.events.CopyDataToEditorEvent;
import org.zanata.webtrans.client.events.KeyShortcutEvent;
import org.zanata.webtrans.client.events.KeyShortcutEventHandler;
import org.zanata.webtrans.client.events.NotificationEvent;
import org.zanata.webtrans.client.events.ReviewCommentEvent;
import org.zanata.webtrans.client.events.ReviewCommentEventHandler;
import org.zanata.webtrans.client.keys.KeyShortcut;
import org.zanata.webtrans.client.keys.Keys;
import org.zanata.webtrans.client.keys.ShortcutContext;
import org.zanata.webtrans.client.resources.WebTransMessages;
import org.zanata.webtrans.client.rpc.AbstractAsyncCallback;
import org.zanata.webtrans.client.rpc.CachingDispatchAsync;
import org.zanata.webtrans.client.service.GetTransUnitActionContextHolder;
import org.zanata.webtrans.client.ui.TranslationHistoryDisplay;
import org.zanata.webtrans.shared.model.ComparableByDate;
import org.zanata.webtrans.shared.model.ReviewComment;
import org.zanata.webtrans.shared.model.TransHistoryItem;
import org.zanata.webtrans.shared.model.TransUnitId;
import org.zanata.webtrans.shared.rpc.AddReviewCommentAction;
import org.zanata.webtrans.shared.rpc.AddReviewCommentResult;
import org.zanata.webtrans.shared.rpc.GetTranslationHistoryAction;
import org.zanata.webtrans.shared.rpc.GetTranslationHistoryResult;
import com.allen_sauer.gwt.log.client.Log;
import com.google.common.base.Objects;
import com.google.common.collect.Lists;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.inject.Inject;
import com.google.inject.Singleton;

import net.customware.gwt.presenter.client.EventBus;
import net.customware.gwt.presenter.client.widget.WidgetPresenter;

/**
* @author Patrick Huang <a
*         href="mailto:pahuang@redhat.com">pahuang@redhat.com</a>
*/
@Singleton
public class TranslationHistoryPresenter extends
        WidgetPresenter<TranslationHistoryDisplay> implements
        TranslationHistoryDisplay.Listener, ReviewCommentEventHandler {
    private final TranslationHistoryDisplay display;
    private final EventBus eventBus;
    private final CachingDispatchAsync dispatcher;
    private final WebTransMessages messages;
    private final GetTransUnitActionContextHolder contextHolder;
    private final KeyShortcutPresenter keyShortcutPresenter;
    private TargetContentsPresenter targetContentsPresenter;
    private TransUnitId transUnitId;
    private ComparingPair comparingPair = ComparingPair.empty();

    @Inject
    public TranslationHistoryPresenter(TranslationHistoryDisplay display,
            EventBus eventBus, CachingDispatchAsync dispatcher,
            WebTransMessages messages,
            GetTransUnitActionContextHolder contextHolder,
            KeyShortcutPresenter keyShortcutPresenter) {
        super(display, eventBus);
        this.display = display;
        this.eventBus = eventBus;
        this.dispatcher = dispatcher;
        this.messages = messages;
        this.contextHolder = contextHolder;
        this.keyShortcutPresenter = keyShortcutPresenter;

        display.setListener(this);
        eventBus.addHandler(ReviewCommentEvent.TYPE, this);
        registerKeyShortcut();
    }

    private void registerKeyShortcut() {
        KeyShortcut confirmShortcut =
                KeyShortcut.Builder.builder()
                        .addKey(new Keys(Keys.CTRL_KEY, KeyCodes.KEY_ENTER))
                        .setContext(ShortcutContext.TransHistoryPopup)
                        .setHandler(new KeyShortcutEventHandler() {
                            @Override
                            public void onKeyShortcut(KeyShortcutEvent event) {
                                addComment(display.getComment());
                            }
                        }).build();
        keyShortcutPresenter.register(confirmShortcut);
    }

    @Override
    public void onShowReviewComment(ReviewCommentEvent event) {
        showTranslationHistory(event.getTransUnitId());
    }

    public void showTranslationHistory(final TransUnitId transUnitId) {
        this.transUnitId = transUnitId;
        popupAndShowLoading(messages.translationHistory());
        dispatcher.execute(new GetTranslationHistoryAction(transUnitId),
                new AsyncCallback<GetTranslationHistoryResult>() {
                    @Override
                    public void onFailure(Throwable caught) {
                        Log.error("failure getting translation history", caught);
                        eventBus.fireEvent(new NotificationEvent(
                                NotificationEvent.Severity.Error, caught
                                        .getMessage()));
                        display.hide();
                    }

                    @Override
                    public void onSuccess(GetTranslationHistoryResult result) {
                        Log.info("get back " + result.getHistoryItems().size()
                                + " trans history for id:" + transUnitId);
                        displayEntries(result.getLatest(),
                                result.getHistoryItems(),
                                result.getReviewComments());
                    }
                });
    }

    protected void popupAndShowLoading(String title) {
        comparingPair = ComparingPair.empty();
        display.setTitle(title);
        display.resetView();
        display.center();
    }

    protected void displayEntries(TransHistoryItem latest,
            List<TransHistoryItem> otherEntries,
            List<ReviewComment> reviewComments) {
        List<ComparableByDate> all = Lists.newArrayList();
        if (latest != null) {
            // add indicator for latest version
            all.add(latest.setOptionalTag(messages.latest()));
            List<String> newTargets = targetContentsPresenter.getNewTargets();
            if (!Objects.equal(latest.getContents(), newTargets)) {
                all.add(new TransHistoryItem(messages.unsaved(), newTargets,
                        null, messages.you(), new Date()));
            }
        }
        all.addAll(otherEntries);
        all.addAll(reviewComments);
        Collections.sort(all, Collections.reverseOrder());
        display.setData(all);
        // if transunitId is null, it's called by
        // org.zanata.webtrans.client.presenter.TransUnitsTablePresenter.refreshRow
        // in concurrent editing conflict. We will hide the comment field.
        display.enableComment(transUnitId != null);
    }

    @Override
    public void addComment(String commentContent) {
        dispatcher.execute(new AddReviewCommentAction(transUnitId,
                commentContent, contextHolder.getContext().getDocument()
                        .getId()),
                new AbstractAsyncCallback<AddReviewCommentResult>() {
                    @Override
                    public void onSuccess(AddReviewCommentResult result) {
                        display.addCommentToList(result.getComment());
                        display.clearInput();
                    }
                });
    }

    @Override
    public void copyIntoEditor(List<String> contents) {
        eventBus.fireEvent(new CopyDataToEditorEvent(contents));
    }

    @Override
    public void compareClicked(TransHistoryItem item) {
        comparingPair = comparingPair.tryAddOrRemoveIfExists(item);
        if (comparingPair.isFull()) {
            display.showDiff(comparingPair.one(), comparingPair.two(), messages
                    .translationHistoryComparison(comparingPair.one()
                            .getVersionNum(), comparingPair.two()
                            .getVersionNum()));
        } else {
            display.disableComparison();
        }
    }

    @Override
    public boolean isItemInComparison(TransHistoryItem item) {
        return comparingPair.contains(item);
    }

    @Override
    protected void onBind() {
    }

    @Override
    protected void onUnbind() {
    }

    @Override
    protected void onRevealDisplay() {
    }

    public void setCurrentValueHolder(
            TargetContentsPresenter targetContentsPresenter) {
        this.targetContentsPresenter = targetContentsPresenter;
    }

}
TOP

Related Classes of org.zanata.webtrans.client.presenter.TranslationHistoryPresenter

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.