cz.mzk.editor.client.presenter.ModifyPresenter.java Source code

Java tutorial

Introduction

Here is the source code for cz.mzk.editor.client.presenter.ModifyPresenter.java

Source

/*
 * Metadata Editor
 * @author Jiri Kremser
 * 
 * 
 * 
 * Metadata Editor - Rich internet application for editing metadata.
 * Copyright (C) 2011  Jiri Kremser (kremser@mzk.cz)
 * Moravian Library in Brno
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 *
 * 
 */

package cz.mzk.editor.client.presenter;

import java.util.List;

import javax.inject.Inject;

import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.web.bindery.event.shared.EventBus;
import com.gwtplatform.dispatch.rpc.shared.DispatchAsync;
import com.gwtplatform.mvp.client.HasUiHandlers;
import com.gwtplatform.mvp.client.Presenter;
import com.gwtplatform.mvp.client.View;
import com.gwtplatform.mvp.client.annotations.NameToken;
import com.gwtplatform.mvp.client.annotations.ProxyCodeSplit;
import com.gwtplatform.mvp.client.proxy.PlaceManager;
import com.gwtplatform.mvp.shared.proxy.PlaceRequest;
import com.gwtplatform.mvp.client.proxy.ProxyPlace;
import com.gwtplatform.mvp.client.proxy.RevealContentEvent;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.types.Side;
import com.smartgwt.client.util.BooleanCallback;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.ImgButton;
import com.smartgwt.client.widgets.Progressbar;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.menu.Menu;
import com.smartgwt.client.widgets.menu.MenuItem;
import com.smartgwt.client.widgets.menu.events.MenuItemClickEvent;
import com.smartgwt.client.widgets.tab.Tab;
import com.smartgwt.client.widgets.tab.TabSet;
import com.smartgwt.client.widgets.tile.TileGrid;

import cz.mzk.editor.client.LangConstants;
import cz.mzk.editor.client.NameTokens;
import cz.mzk.editor.client.config.EditorClientConfiguration;
import cz.mzk.editor.client.dispatcher.DispatchCallback;
import cz.mzk.editor.client.dispatcher.TryAgainCallbackError;
import cz.mzk.editor.client.uihandlers.ModifyUiHandlers;
import cz.mzk.editor.client.util.ClientUtils;
import cz.mzk.editor.client.util.Constants;
import cz.mzk.editor.client.util.Constants.NAME_OF_TREE;
import cz.mzk.editor.client.view.ModifyView;
import cz.mzk.editor.client.view.other.ContainerRecord;
import cz.mzk.editor.client.view.other.EditorTabSet;
import cz.mzk.editor.client.view.window.AddOcrWindow;
import cz.mzk.editor.client.view.window.ChangeRightsWindow;
import cz.mzk.editor.client.view.window.DownloadFoxmlWindow;
import cz.mzk.editor.client.view.window.EditorSC;
import cz.mzk.editor.client.view.window.LockDigitalObjectWindow;
import cz.mzk.editor.client.view.window.ModalWindow;
import cz.mzk.editor.client.view.window.RemoveDigitalObjectWindow;
import cz.mzk.editor.client.view.window.SortingWindow;
import cz.mzk.editor.client.view.window.StoreWorkingCopyWindow;
import cz.mzk.editor.shared.domain.DigitalObjectModel;
import cz.mzk.editor.shared.event.ChangeFocusedTabSetEvent;
import cz.mzk.editor.shared.event.DigitalObjectClosedEvent;
import cz.mzk.editor.shared.event.DigitalObjectClosedEvent.DigitalObjectClosedHandler;
import cz.mzk.editor.shared.event.DigitalObjectOpenedEvent;
import cz.mzk.editor.shared.event.EscKeyPressedEvent;
import cz.mzk.editor.shared.event.KeyPressedEvent;
import cz.mzk.editor.shared.event.OpenDigitalObjectEvent;
import cz.mzk.editor.shared.event.RefreshTreeEvent;
import cz.mzk.editor.shared.rpc.DigitalObjectDetail;
import cz.mzk.editor.shared.rpc.DigitalObjectRelationships;
import cz.mzk.editor.shared.rpc.DublinCore;
import cz.mzk.editor.shared.rpc.LockInfo;
import cz.mzk.editor.shared.rpc.RecentlyModifiedItem;
import cz.mzk.editor.shared.rpc.StoredItem;
import cz.mzk.editor.shared.rpc.action.DownloadDigitalObjectDetailAction;
import cz.mzk.editor.shared.rpc.action.DownloadDigitalObjectDetailResult;
import cz.mzk.editor.shared.rpc.action.GetDescriptionAction;
import cz.mzk.editor.shared.rpc.action.GetDescriptionResult;
import cz.mzk.editor.shared.rpc.action.GetDigitalObjectDetailAction;
import cz.mzk.editor.shared.rpc.action.GetDigitalObjectDetailResult;
import cz.mzk.editor.shared.rpc.action.GetLockInformationAction;
import cz.mzk.editor.shared.rpc.action.GetLockInformationResult;
import cz.mzk.editor.shared.rpc.action.GetObjectsToSortAction;
import cz.mzk.editor.shared.rpc.action.GetObjectsToSortResult;
import cz.mzk.editor.shared.rpc.action.GetRelationshipsAction;
import cz.mzk.editor.shared.rpc.action.GetRelationshipsResult;
import cz.mzk.editor.shared.rpc.action.PutDescriptionAction;
import cz.mzk.editor.shared.rpc.action.PutDescriptionResult;
import cz.mzk.editor.shared.rpc.action.PutDigitalObjectDetailAction;
import cz.mzk.editor.shared.rpc.action.PutDigitalObjectDetailResult;
import cz.mzk.editor.shared.rpc.action.UnlockDigitalObjectAction;
import cz.mzk.editor.shared.rpc.action.UnlockDigitalObjectResult;

public class ModifyPresenter extends Presenter<ModifyPresenter.MyView, ModifyPresenter.MyProxy>
        implements ModifyUiHandlers {

    private LangConstants lang;

    @Inject
    public void setLang(LangConstants lang) {
        this.lang = lang;
    }

    @Inject
    private final EditorClientConfiguration config;

    /**
     * The Interface MyView.
     */
    public interface MyView extends View, HasUiHandlers<ModifyUiHandlers> {

        void shortcutPressed(int code);

        public Record[] fromClipboard();

        public void toClipboard(final Record[] data);

        public PopupPanel getPopupPanel();

        public Canvas getEditor(String text, String uuid, boolean common);

        void addDigitalObject(String uuid, DigitalObjectDetail detail, boolean refresh,
                boolean storedDigitalObject);

        void addStream(Record[] items, String uuid, DigitalObjectModel model);

        DownloadFoxmlWindow getDownloadingWindow();

        void setConfiguration(EditorClientConfiguration config);

        void updateLockInformation(EditorTabSet ts);

        void publish(EditorTabSet ts);

        void storeWork(EditorTabSet ts);
    }

    /**
     * The Interface MyProxy.
     */
    @ProxyCodeSplit
    @NameToken(NameTokens.MODIFY)
    public interface MyProxy extends ProxyPlace<ModifyPresenter> {

    }

    /** The done. */
    private int done = 0;

    /** The dispatcher. */
    private final DispatchAsync dispatcher;

    /** The left presenter. */
    private final DigitalObjectMenuPresenter leftPresenter;

    /** The uuid. */
    private String uuid;

    /** The previous uuid. */
    private String previousUuid1;

    /** The previous uuid2. */
    private String previousUuid2;

    /** The forced refresh. */
    private boolean forcedRefresh;

    /** The place manager. */
    private final PlaceManager placeManager;

    /** The saved edited object. */
    private StoredItem savedEditedObject;

    /** The model of the stored digital object which is going to be opened. */
    private String modelToOpen;

    /**
     * Instantiates a new modify presenter.
     *
     * @param eventBus
     *        the event bus
     * @param view
     *        the view
     * @param proxy
     *        the proxy
     * @param leftPresenter
     *        the left presenter
     * @param dispatcher
     *        the dispatcher
     * @param placeManager
     *        the place manager
     */
    @Inject
    public ModifyPresenter(final EventBus eventBus, final MyView view, final MyProxy proxy,
            final DigitalObjectMenuPresenter leftPresenter, final DispatchAsync dispatcher,
            final PlaceManager placeManager, final EditorClientConfiguration config) {
        super(eventBus, view, proxy);
        this.leftPresenter = leftPresenter;
        this.dispatcher = dispatcher;
        this.placeManager = placeManager;
        getView().setUiHandlers(this);
        this.config = config;
    }

    /*
     * (non-Javadoc)
     * @see com.gwtplatform.mvp.client.HandlerContainerImpl#onBind()
     */
    @Override
    protected void onBind() {
        super.onBind();

        getView().setConfiguration(config);

        addRegisteredHandler(DigitalObjectClosedEvent.getType(), new DigitalObjectClosedHandler() {

            @Override
            public void onDigitalObjectClosed(DigitalObjectClosedEvent event) {
                String uuid = event.getUuid();
                if (uuid != null) {
                    if (uuid.equals(previousUuid2)) {
                        previousUuid2 = null;
                    } else if (uuid.equals(previousUuid1)) {
                        if (previousUuid2 == null) {
                            previousUuid1 = null;
                        } else { // move
                            previousUuid1 = previousUuid2;
                            previousUuid2 = null;
                        }
                    }
                }
            }
        });

        addRegisteredHandler(KeyPressedEvent.getType(), new KeyPressedEvent.KeyPressedHandler() {

            @Override
            public void onKeyPressed(KeyPressedEvent event) {
                getView().shortcutPressed(event.getCode());
            }

        });
        addRegisteredHandler(OpenDigitalObjectEvent.getType(),
                new OpenDigitalObjectEvent.OpenDigitalObjectHandler() {

                    @Override
                    public void onOpenDigitalObject(OpenDigitalObjectEvent event) {
                        openAnotherObject(event.getUuid(), event.getStoredItem());
                        if (RemoveDigitalObjectWindow.isInstanceVisible())
                            RemoveDigitalObjectWindow.closeInstantiatedWindow();
                    }
                });
    }

    /*
     * (non-Javadoc)
     * @see
     * com.gwtplatform.mvp.client.Presenter#prepareFromRequest(com.gwtplatform
     * .mvp.client.proxy.PlaceRequest)
     */
    @Override
    public void prepareFromRequest(PlaceRequest request) {
        super.prepareFromRequest(request);
        uuid = request.getParameter(Constants.URL_PARAM_UUID, null);
        String id = request.getParameter(Constants.ATTR_ID, null);
        savedEditedObject = new StoredItem(id != null ? Long.parseLong(id) : null,
                request.getParameter(Constants.ATTR_FILE_NAME, null));
        modelToOpen = request.getParameter(Constants.ATTR_MODEL, null);
        forcedRefresh = ClientUtils.toBoolean(request.getParameter(Constants.URL_PARAM_REFRESH, "no"));
        leftPresenter.getView().showInputQueue(dispatcher, placeManager, true);
    }

    /*
     * (non-Javadoc)
     * @see com.gwtplatform.mvp.client.HandlerContainerImpl#onUnbind()
     */
    @Override
    protected void onUnbind() {
        super.onUnbind();
        // Add unbind functionality here for more complex presenters.
    }

    /*
     * (non-Javadoc)
     * @see com.gwtplatform.mvp.client.PresenterWidget#onReset()
     */
    @Override
    protected void onReset() {
        super.onReset();
        if (uuid != null && (forcedRefresh || (!uuid.equals(previousUuid1) && !uuid.equals(previousUuid2)))) {
            Image loader = new Image("images/loadingAnimation3.gif");
            getView().getPopupPanel().setWidget(loader);
            getView().getPopupPanel().setVisible(true);
            getView().getPopupPanel().center();
            getObject(forcedRefresh);
            forcedRefresh = false;
            if (!uuid.equals(previousUuid1) && !uuid.equals(previousUuid2)) {
                previousUuid2 = previousUuid1;
                previousUuid1 = uuid;
            }
        }
        RevealContentEvent.fire(this, Constants.TYPE_MEDIT_LEFT_CONTENT, leftPresenter);

    }

    /*
     * (non-Javadoc)
     * @see cz.mzk.editor.client.view.ModifyView.MyUiHandlers#
     * onAddDigitalObject(com.smartgwt.client.widgets.tile.TileGrid,
     * com.smartgwt.client.widgets.menu.Menu)
     */
    @Override
    public void onAddDigitalObject(final TileGrid tileGrid, final Menu menu) {
        MenuItem[] items = menu.getItems();
        if (!ModifyView.ID_EDIT.equals(items[0].getAttributeAsObject(ModifyView.ID_NAME))) {
            throw new IllegalStateException("Inconsistent gui.");
        }
        items[0].addClickHandler(new com.smartgwt.client.widgets.menu.events.ClickHandler() {

            @Override
            public void onClick(MenuItemClickEvent event) {
                String uuidToEdit = tileGrid.getSelection()[0].getAttribute(Constants.ATTR_UUID);
                placeManager.revealRelativePlace(new PlaceRequest.Builder().nameToken(NameTokens.MODIFY)
                        .with(Constants.URL_PARAM_UUID, uuidToEdit).build());
            }
        });
        if (!ModifyView.ID_SEL_ALL.equals(items[2].getAttributeAsObject(ModifyView.ID_NAME))) {
            throw new IllegalStateException("Inconsistent gui.");
        }
        items[2].addClickHandler(new com.smartgwt.client.widgets.menu.events.ClickHandler() {

            @Override
            public void onClick(MenuItemClickEvent event) {
                tileGrid.selectAllRecords();
            }
        });
        if (!ModifyView.ID_SEL_NONE.equals(items[3].getAttributeAsObject(ModifyView.ID_NAME))) {
            throw new IllegalStateException("Inconsistent gui.");
        }
        items[3].addClickHandler(new com.smartgwt.client.widgets.menu.events.ClickHandler() {

            @Override
            public void onClick(MenuItemClickEvent event) {
                tileGrid.deselectAllRecords();
            }
        });
        if (!ModifyView.ID_SEL_INV.equals(items[4].getAttributeAsObject(ModifyView.ID_NAME))) {
            throw new IllegalStateException("Inconsistent gui.");
        }
        items[4].addClickHandler(new com.smartgwt.client.widgets.menu.events.ClickHandler() {

            @Override
            public void onClick(MenuItemClickEvent event) {
                Record[] selected = tileGrid.getSelection();
                tileGrid.selectAllRecords();
                tileGrid.deselectRecords(selected);
            }
        });
        if (!ModifyView.ID_COPY.equals(items[6].getAttributeAsObject(ModifyView.ID_NAME))) {
            throw new IllegalStateException("Inconsistent gui.");
        }
        items[6].addClickHandler(new com.smartgwt.client.widgets.menu.events.ClickHandler() {

            @Override
            public void onClick(MenuItemClickEvent event) {
                getView().toClipboard(tileGrid.getSelection());
            }
        });
        if (!ModifyView.ID_PASTE.equals(items[7].getAttributeAsObject(ModifyView.ID_NAME))) {
            throw new IllegalStateException("Inconsistent gui.");
        }
        items[7].addClickHandler(new com.smartgwt.client.widgets.menu.events.ClickHandler() {

            @Override
            public void onClick(MenuItemClickEvent event) {
                final Record[] data = getView().fromClipboard();
                final boolean progressbar = data.length > Constants.CLIPBOARD_MAX_WITHOUT_PROGRESSBAR;
                final Progressbar hBar1 = progressbar ? new Progressbar() : null;
                if (progressbar) {
                    hBar1.setHeight(24);
                    hBar1.setVertical(false);
                    hBar1.setPercentDone(0);
                    getView().getPopupPanel().setWidget(hBar1);
                    getView().getPopupPanel().setVisible(true);
                    getView().getPopupPanel().center();
                    done = 0;
                    Timer timer = new Timer() {

                        @Override
                        public void run() {
                            hBar1.setPercentDone(((100 * (done + 1)) / data.length));
                            tileGrid.addData(((ContainerRecord) data[done]).deepCopy());
                            if (++done != data.length) {
                                schedule(15);
                            } else {
                                getView().getPopupPanel().setVisible(false);
                                getView().getPopupPanel().hide();
                            }
                        }
                    };
                    timer.schedule(40);
                } else {
                    for (int i = 0; i < data.length; i++) {
                        tileGrid.addData(((ContainerRecord) data[i]).deepCopy());
                    }
                }
            }
        });
        if (!ModifyView.ID_DELETE.equals(items[8].getAttributeAsObject(ModifyView.ID_NAME))) {
            throw new IllegalStateException("Inconsistent gui.");
        }

        items[8].addClickHandler(new com.smartgwt.client.widgets.menu.events.ClickHandler() {

            @Override
            public void onClick(MenuItemClickEvent event) {
                tileGrid.removeSelectedData();
            }
        });
        items[9].addClickHandler(new com.smartgwt.client.widgets.menu.events.ClickHandler() {

            @Override
            public void onClick(MenuItemClickEvent event) {
                if (tileGrid.getSelection().length > 1) {
                    SC.warn(lang.deleteOne());
                } else {
                    removeDigitalObject(tileGrid.getSelection()[0].getAttribute(Constants.ATTR_UUID));
                }
            }
        });
    }

    /*
     * (non-Javadoc)
     * @see com.gwtplatform.mvp.client.Presenter#revealInParent()
     */
    @Override
    protected void revealInParent() {
        RevealContentEvent.fire(this, Constants.TYPE_MEDIT_MAIN_CONTENT, this);
    }

    /*
     * (non-Javadoc)
     * @see cz.mzk.editor.client.view.ModifyView.MyUiHandlers#
     * onAddDigitalObject(java.lang.String,
     * com.smartgwt.client.widgets.ImgButton,
     * com.smartgwt.client.widgets.menu.Menu)
     */
    @Override
    public void onAddDigitalObject(final String uuid, final ImgButton closeButton) {
        closeButton.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                close(uuid);
            }
        });
    }

    @Override
    public void close(String uuid) {
        DigitalObjectClosedEvent.fire(ModifyPresenter.this, uuid);
    }

    @Override
    public void onChangeFocusedTabSet(String focusedUuid) {
        ChangeFocusedTabSetEvent.fire(ModifyPresenter.this, focusedUuid, false);
    }

    /**
     * Gets the object.
     *
     * @param refresh
     *        the refresh
     * @return the object
     */
    private void getObject(final boolean refresh) {
        DigitalObjectModel model = (modelToOpen != null ? DigitalObjectModel.parseString(modelToOpen) : null);
        final GetDigitalObjectDetailAction action = new GetDigitalObjectDetailAction(uuid, model,
                savedEditedObject);
        final DispatchCallback<GetDigitalObjectDetailResult> callback = new DispatchCallback<GetDigitalObjectDetailResult>() {

            @Override
            public void callback(GetDigitalObjectDetailResult result) {
                DigitalObjectDetail detail = result.getDetail();
                if (detail != null) {
                    EscKeyPressedEvent.fire(ModifyPresenter.this);
                    if (null != detail.getLockInfo().getLockOwner()) {
                        EditorSC.objectIsLock(lang, detail.getLockInfo());
                    }

                    getView().addDigitalObject(uuid, detail, refresh,
                            savedEditedObject != null && savedEditedObject.getId() != null);
                    String title = (detail.getDc().getTitle() == null || detail.getDc().getTitle().size() == 0)
                            ? "no title"
                            : detail.getDc().getTitle().get(0);
                    DigitalObjectOpenedEvent.fire(
                            ModifyPresenter.this, true, new RecentlyModifiedItem(uuid, title,
                                    result.getDescription(), detail.getModel(), result.getModified()),
                            result.getDetail().getRelated());
                } else if (savedEditedObject != null) {
                    SC.ask(lang.operationFailed(), lang.storedNotFound(), new BooleanCallback() {

                        @Override
                        public void execute(Boolean value) {
                            if (value != null && value) {
                                StoreWorkingCopyWindow.deleteItem(savedEditedObject.getId(),
                                        savedEditedObject.getFileName(), dispatcher);
                            }
                        }
                    });
                }
                getView().getPopupPanel().setVisible(false);
                getView().getPopupPanel().hide();
            }

            @Override
            public void callbackError(final Throwable t) {
                super.callbackError(t, new TryAgainCallbackError() {

                    @Override
                    public void theMethodForCalling() {
                        getObject(forcedRefresh);
                    }
                });
                getView().getPopupPanel().setVisible(false);
                getView().getPopupPanel().hide();
            }
        };

        dispatcher.execute(action, callback);
    }

    /*
     * (non-Javadoc)
     * @see cz.mzk.editor.client.view.ModifyView.MyUiHandlers#getDescription
     * (java.lang.String, com.smartgwt.client.widgets.tab.TabSet,
     * java.lang.String)
     */
    @Override
    public void getDescription(final String uuid, final TabSet tabSet, final String tabId) {
        dispatcher.execute(new GetDescriptionAction(uuid), new DispatchCallback<GetDescriptionResult>() {

            @Override
            public void callback(GetDescriptionResult result) {
                final TabSet descriptionTabSet = new TabSet();
                descriptionTabSet.setTabBarPosition(Side.RIGHT);
                descriptionTabSet.setWidth100();
                descriptionTabSet.setHeight100();
                Tab commonDesc = new Tab("", "other/more_people.png");
                commonDesc.setPane(getView().getEditor(result.getDescription(), uuid, true));
                Tab userDesc = new Tab("", "other/loner.png");
                userDesc.setPane(getView().getEditor(result.getUserDescription(), uuid, false));
                descriptionTabSet.setTabs(commonDesc, userDesc);
                tabSet.setTabPane(tabId, descriptionTabSet);
            }
        });
    }

    /*
     * (non-Javadoc)
     * @see cz.mzk.editor.client.view.ModifyView.MyUiHandlers#putDescription
     * (java.lang.String, java.lang.String, boolean)
     */
    @Override
    public void putDescription(String uuid, String description, final boolean common) {
        dispatcher.execute(new PutDescriptionAction(uuid, description, common),
                new DispatchCallback<PutDescriptionResult>() {

                    @Override
                    public void callback(PutDescriptionResult result) {
                        if (!common) {
                            RefreshTreeEvent.fire(ModifyPresenter.this, NAME_OF_TREE.RECENTLY_MODIFIED);
                        }
                    }
                });
    }

    /*
     * (non-Javadoc)
     * @see cz.mzk.editor.client.view.ModifyView.MyUiHandlers#
     * onSaveDigitalObject
     * (cz.mzk.editor.shared.valueobj.AbstractDigitalObjectDetail)
     */
    @Override
    public void onSaveDigitalObject(final DigitalObjectDetail digitalObject, boolean versionable, boolean reindex) {
        dispatcher.execute(new PutDigitalObjectDetailAction(digitalObject, versionable, true),
                new DispatchCallback<PutDigitalObjectDetailResult>() {

                    @Override
                    public void callback(PutDigitalObjectDetailResult result) {
                        if (!result.isSaved()) {
                            SC.say(lang.mesCanNotPublish());
                        } else {
                            askToRefresh(digitalObject.getUuid());
                        }
                    }

                    @Override
                    public void callbackError(Throwable t) {
                        super.callbackError(t);
                    }
                });
    }

    private void askToRefresh(final String uuid) {
        SC.ask(lang.operationSuccessful() + "<br>" + lang.refreshQuestion(), new BooleanCallback() {

            @Override
            public void execute(Boolean value) {
                if (value) {
                    onRefresh(uuid);
                }
            }
        });
    }

    /*
     * (non-Javadoc)
     * @see cz.mzk.editor.client.view.ModifyView.MyUiHandlers#
     * onDownloadDigitalObject
     * (cz.mzk.editor.shared.valueobj.AbstractDigitalObjectDetail)
     */
    @Override
    public void onHandleWorkingCopyDigObj(final DigitalObjectDetail digitalObject) {
        dispatcher.execute(new DownloadDigitalObjectDetailAction(digitalObject),
                new DispatchCallback<DownloadDigitalObjectDetailResult>() {

                    @Override
                    public void callback(DownloadDigitalObjectDetailResult result) {
                        int length = result.getStringsWithXml().length;
                        String[] stringsWithXml = new String[length];
                        for (int i = 0; i < length; i++) {
                            stringsWithXml[i] = result.getStringsWithXml()[i];
                        }
                        getView().getDownloadingWindow().setStringsWithXml(stringsWithXml);
                    }

                    @Override
                    public void callbackError(Throwable t) {
                        super.callbackError(t);
                    }
                });
    }

    /*
     * (non-Javadoc)
     * @see cz.mzk.editor.client.view.ModifyView.MyUiHandlers#onRefresh
     * (java.lang.String)
     */
    @Override
    public void onRefresh(String uuid) {
        placeManager.revealRelativePlace(new PlaceRequest.Builder().nameToken(NameTokens.MODIFY)
                .with(Constants.URL_PARAM_UUID, uuid).with(Constants.URL_PARAM_REFRESH, "yes").build());
    }

    @Override
    public void getStream(final String uuid, final DigitalObjectModel model, final TabSet ts) {

        final ModalWindow mw = new ModalWindow(ts);
        mw.setLoadingIcon("loadingAnimation.gif");
        mw.show(true);

        final GetDigitalObjectDetailAction action = new GetDigitalObjectDetailAction(uuid, model, null);
        final DispatchCallback<GetDigitalObjectDetailResult> callback = new DispatchCallback<GetDigitalObjectDetailResult>() {

            @Override
            public void callback(GetDigitalObjectDetailResult result) {
                mw.show(lang.rendering(), true);
                DigitalObjectDetail detail = result.getDetail();
                List<DigitalObjectDetail> itemList = detail.getItems();
                Record[] items = null;
                if (itemList.size() > 0) {
                    items = new Record[itemList.size()];
                    for (int i = 0, total = itemList.size(); i < total; i++) {
                        DublinCore dc = itemList.get(i).getDc();
                        if (dc != null) {
                            String title = dc.getTitle() == null ? lang.noTitle() : dc.getTitle().get(0);
                            String id = dc.getIdentifier() == null ? lang.noTitle() : dc.getIdentifier().get(0);
                            items[i] = new ContainerRecord(title, id,
                                    DigitalObjectModel.PAGE.equals(model) ? id : model.getIcon());
                        } else {
                            items[i] = new ContainerRecord(lang.objectNotFound(), lang.objectNotFound(),
                                    DigitalObjectModel.PAGE.equals(model) ? Constants.MISSING
                                            : "icons/128/folder_not_found.png");
                        }
                    }
                }
                getView().addStream(items, uuid, model);
                mw.hide();
            }

            @Override
            public void callbackError(final Throwable t) {
                super.callbackError(t, new TryAgainCallbackError() {

                    @Override
                    public void theMethodForCalling() {
                        getStream(uuid, model, ts);
                    }
                });
                mw.hide();
            }
        };

        dispatcher.execute(action, callback);
    }

    /**
     * {@inheritDoc}
     *
     * @param storedItem
     */

    @Override
    public void openAnotherObject(String uuid, StoredItem storedItem) {
        if (storedItem != null) {
            placeManager.revealRelativePlace(new PlaceRequest.Builder().nameToken(NameTokens.MODIFY)
                    .with(Constants.URL_PARAM_UUID, uuid).with(Constants.ATTR_FILE_NAME, storedItem.getFileName())
                    .with(Constants.ATTR_MODEL, storedItem.getModel().getValue())
                    .with(Constants.ATTR_ID, String.valueOf(storedItem.getId())).build());
        } else {
            placeManager.revealRelativePlace(new PlaceRequest.Builder().nameToken(NameTokens.MODIFY)
                    .with(Constants.URL_PARAM_UUID, uuid).build());
        }
    }

    @Override
    public void getLockDigitalObjectInformation(final EditorTabSet ts, final boolean calledDuringPublishing) {
        final ModalWindow mw = new ModalWindow(ts);
        mw.setLoadingIcon("loadingAnimation.gif");
        mw.show(true);

        GetLockInformationAction lockInfoAction = new GetLockInformationAction(ts.getUuid());
        DispatchCallback<GetLockInformationResult> lockInfoCallback = new DispatchCallback<GetLockInformationResult>() {

            @Override
            public void callback(GetLockInformationResult result) {

                LockInfo lockInfo = result.getLockInfo();
                if (null != lockInfo.getLockOwner()) {
                    if (calledDuringPublishing) {
                        if ("".equals(lockInfo.getLockOwner())) {
                            getView().publish(ts);
                        } else {
                            String message = EditorSC.getObjectIsLockMessage(lang, lockInfo, lang.storeQuestion());
                            SC.ask(message, new BooleanCallback() {

                                @Override
                                public void execute(Boolean value) {
                                    if (value) {
                                        getView().storeWork(ts);
                                    }
                                }
                            });
                        }
                    } else {
                        EditorSC.objectIsLock(lang, lockInfo);
                    }
                } else {
                    if (calledDuringPublishing) {
                        getView().publish(ts);
                    } else {
                        SC.say(lang.noLocked());
                    }
                }
                ts.setLockInfo(lockInfo);
                getView().updateLockInformation(ts);
                mw.hide();
            }

            @Override
            public void callbackError(final Throwable t) {
                super.callbackError(t, new TryAgainCallbackError() {

                    @Override
                    public void theMethodForCalling() {
                        getLockDigitalObjectInformation(ts, calledDuringPublishing);
                    }
                });
                mw.hide();
            }
        };
        dispatcher.execute(lockInfoAction, lockInfoCallback);

    }

    /**
     * {@inheritDoc}
     */

    @Override
    public void lockDigitalObject(final EditorTabSet ts) {

        LockDigitalObjectWindow.setInstanceOf(lang, ts, dispatcher, getEventBus());

    }

    /**
     * {@inheritDoc}
     */

    @Override
    public void unlockDigitalObject(final EditorTabSet ts) {
        final ModalWindow mw = new ModalWindow(ts);
        mw.setLoadingIcon("loadingAnimation.gif");
        mw.show(true);

        final UnlockDigitalObjectAction unlockAction = new UnlockDigitalObjectAction(ts.getUuid());
        final DispatchCallback<UnlockDigitalObjectResult> unlockCallback = new DispatchCallback<UnlockDigitalObjectResult>() {

            @Override
            public void callback(UnlockDigitalObjectResult result) {
                if (result.isSuccessful()) {
                    SC.say(lang.objectUnlocked(), lang.objectUnlocked());
                    ts.setLockInfo(new LockInfo());
                } else {
                    EditorSC.operationFailed(lang, null);
                }
                mw.hide();
            }

            @Override
            public void callbackError(final Throwable t) {
                super.callbackError(t, new TryAgainCallbackError() {

                    @Override
                    public void theMethodForCalling() {
                        unlockDigitalObject(ts);
                    }
                });
                mw.hide();
            }
        };
        dispatcher.execute(unlockAction, unlockCallback);
    }

    /**
     * {@inheritDoc}
     */

    @Override
    public void storeFoxmlFile(DigitalObjectDetail detail, EditorTabSet ts) {
        StoreWorkingCopyWindow.setLabelsFieldsButtons(detail, ts);
    }

    /**
     * {@inheritDoc}
     */

    @Override
    public void removeDigitalObject(String uuid) {
        RemoveDigitalObjectWindow.setInstanceOf(uuid, lang, dispatcher, getEventBus());
    }

    /**
     * {@inheritDoc}
     */

    @Override
    public void changeRights(String uuid, String oldRight) {
        new ChangeRightsWindow(uuid, getEventBus(), oldRight, lang, dispatcher);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void sortWithChildren(final String uuid) {
        final SortingWindow sortingWindow = new SortingWindow(lang, dispatcher, getEventBus()) {

            @Override
            protected void afterPublishAction() {
                askToRefresh(uuid);
            }
        };

        GetObjectsToSortAction toSortAction = new GetObjectsToSortAction(uuid);
        dispatcher.execute(toSortAction, new DispatchCallback<GetObjectsToSortResult>() {

            @Override
            public void callback(GetObjectsToSortResult result) {
                DigitalObjectRelationships digObjRel = result.getDigObjRel();
                sortingWindow.setObjects(digObjRel);
            }
        });

    }

    @Override
    public void addOcr(final String uuid) {
        final AddOcrWindow addOcrWindow = new AddOcrWindow(lang, dispatcher, getEventBus(), uuid);

        GetRelationshipsAction.Builder builder = new GetRelationshipsAction.Builder(uuid);
        builder.withTitle(true);
        dispatcher.execute(builder.build(), new DispatchCallback<GetRelationshipsResult>() {
            @Override
            public void callback(GetRelationshipsResult result) {
                DigitalObjectRelationships digObjRel = result.getDigObjRel();
                addOcrWindow.setObjects(digObjRel);
            }
        });

    }
}