/*******************************************************************************
* Copyright (c) 2012-2016 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.ext.java.client.refactoring.preview;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
import org.eclipse.che.api.promises.client.Operation;
import org.eclipse.che.api.promises.client.OperationException;
import org.eclipse.che.api.promises.client.Promise;
import org.eclipse.che.ide.api.editor.EditorAgent;
import org.eclipse.che.ide.api.editor.EditorPartPresenter;
import org.eclipse.che.ide.dto.DtoFactory;
import org.eclipse.che.ide.ext.java.client.refactoring.RefactorInfo;
import org.eclipse.che.ide.ext.java.client.refactoring.RefactoringUpdater;
import org.eclipse.che.ide.ext.java.client.refactoring.move.wizard.MovePresenter;
import org.eclipse.che.ide.ext.java.client.refactoring.rename.wizard.RenamePresenter;
import org.eclipse.che.ide.ext.java.client.refactoring.service.RefactoringServiceClient;
import org.eclipse.che.ide.ext.java.shared.dto.refactoring.ChangeEnabledState;
import org.eclipse.che.ide.ext.java.shared.dto.refactoring.ChangePreview;
import org.eclipse.che.ide.ext.java.shared.dto.refactoring.RefactoringChange;
import org.eclipse.che.ide.ext.java.shared.dto.refactoring.RefactoringPreview;
import org.eclipse.che.ide.ext.java.shared.dto.refactoring.RefactoringResult;
import org.eclipse.che.ide.ext.java.shared.dto.refactoring.RefactoringSession;
import org.eclipse.che.ide.jseditor.client.texteditor.TextEditor;
import static org.eclipse.che.ide.ext.java.shared.dto.refactoring.RefactoringStatus.OK;
/**
* @author Dmitry Shnurenko
* @author Valeriy Svydenko
*/
@Singleton
public class PreviewPresenter implements PreviewView.ActionDelegate {
private final PreviewView view;
private final Provider<RenamePresenter> renamePresenterProvider;
private final DtoFactory dtoFactory;
private final EditorAgent editorAgent;
private final RefactoringUpdater refactoringUpdater;
private final RefactoringServiceClient refactoringService;
private final Provider<MovePresenter> movePresenterProvider;
private RefactorInfo refactorInfo;
private RefactoringSession session;
@Inject
public PreviewPresenter(PreviewView view,
Provider<MovePresenter> movePresenterProvider,
Provider<RenamePresenter> renamePresenterProvider,
DtoFactory dtoFactory,
EditorAgent editorAgent,
RefactoringUpdater refactoringUpdater,
RefactoringServiceClient refactoringService) {
this.view = view;
this.renamePresenterProvider = renamePresenterProvider;
this.dtoFactory = dtoFactory;
this.editorAgent = editorAgent;
this.refactoringUpdater = refactoringUpdater;
this.refactoringService = refactoringService;
this.view.setDelegate(this);
this.movePresenterProvider = movePresenterProvider;
}
public void show(String refactoringSessionId, RefactorInfo refactorInfo) {
this.refactorInfo = refactorInfo;
session = dtoFactory.createDto(RefactoringSession.class);
session.setSessionId(refactoringSessionId);
refactoringService.getRefactoringPreview(session).then(new Operation<RefactoringPreview>() {
@Override
public void apply(RefactoringPreview changes) throws OperationException {
view.setTreeOfChanges(changes);
}
});
view.show();
}
/**
* Set a title of the window.
*
* @param title
* the name of the preview window
*/
public void setTitle(String title) {
view.setTitle(title);
}
/** {@inheritDoc} */
@Override
public void onCancelButtonClicked() {
EditorPartPresenter activeEditor = editorAgent.getActiveEditor();
if (activeEditor instanceof TextEditor) {
((TextEditor)activeEditor).setFocus();
}
}
/** {@inheritDoc} */
@Override
public void onAcceptButtonClicked() {
refactoringService.applyRefactoring(session).then(new Operation<RefactoringResult>() {
@Override
public void apply(RefactoringResult result) throws OperationException {
if (result.getSeverity() == OK) {
view.hide();
refactoringUpdater.updateAfterRefactoring(refactorInfo, result.getChanges());
} else {
view.showErrorMessage(result);
}
}
});
}
/** {@inheritDoc} */
@Override
public void onBackButtonClicked() {
if (refactorInfo == null || refactorInfo.getMoveType() == null) {
RenamePresenter renamePresenter = renamePresenterProvider.get();
renamePresenter.show(refactorInfo);
} else {
MovePresenter movePresenter = movePresenterProvider.get();
movePresenter.show(refactorInfo);
}
view.hide();
}
/** {@inheritDoc} */
@Override
public void onEnabledStateChanged(final RefactoringPreview change) {
ChangeEnabledState changeEnableState = dtoFactory.createDto(ChangeEnabledState.class);
changeEnableState.setChangeId(change.getId());
changeEnableState.setSessionId(session.getSessionId());
changeEnableState.setEnabled(change.isEnabled());
refactoringService.changeChangeEnabledState(changeEnableState).then(new Operation<Void>() {
@Override
public void apply(Void arg) throws OperationException {
onSelectionChanged(change);
}
});
}
/** {@inheritDoc} */
@Override
public void onSelectionChanged(RefactoringPreview change) {
RefactoringChange refactoringChanges = dtoFactory.createDto(RefactoringChange.class);
refactoringChanges.setChangeId(change.getId());
refactoringChanges.setSessionId(session.getSessionId());
Promise<ChangePreview> changePreviewPromise = refactoringService.getChangePreview(refactoringChanges);
changePreviewPromise.then(new Operation<ChangePreview>() {
@Override
public void apply(ChangePreview arg) throws OperationException {
view.showDiff(arg);
}
});
}
}