/*******************************************************************************
* 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.extension.machine.client.outputspanel;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.google.web.bindery.event.shared.EventBus;
import org.eclipse.che.commons.annotation.Nullable;
import org.eclipse.che.ide.Resources;
import org.eclipse.che.ide.api.event.project.CloseCurrentProjectEvent;
import org.eclipse.che.ide.api.event.project.CloseCurrentProjectHandler;
import org.eclipse.che.ide.api.event.project.ProjectReadyEvent;
import org.eclipse.che.ide.api.event.project.ProjectReadyHandler;
import org.eclipse.che.ide.api.mvp.View;
import org.eclipse.che.ide.api.parts.HasView;
import org.eclipse.che.ide.api.outputconsole.OutputConsole;
import org.eclipse.che.ide.api.parts.base.BasePresenter;
import org.eclipse.che.ide.extension.machine.client.MachineLocalizationConstant;
import org.eclipse.che.ide.ui.dialogs.ConfirmCallback;
import org.eclipse.che.ide.ui.dialogs.DialogFactory;
import org.vectomatic.dom.svg.ui.SVGResource;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;
/**
* Container for the output consoles.
*
* @author Artem Zatsarynnyi
*/
@Singleton
public class OutputsContainerPresenter extends BasePresenter implements OutputsContainerView.ActionDelegate,
HasView,
ProjectReadyHandler,
CloseCurrentProjectHandler {
private final MachineLocalizationConstant localizationConstant;
private final DialogFactory dialogFactory;
private final OutputsContainerView view;
private final Resources resources;
private final List<OutputConsole> consoles;
@Inject
public OutputsContainerPresenter(OutputsContainerView view,
MachineLocalizationConstant localizationConstant,
EventBus eventBus,
DialogFactory dialogFactory,
Resources resources) {
this.view = view;
this.localizationConstant = localizationConstant;
this.dialogFactory = dialogFactory;
this.resources = resources;
this.view.setTitle(localizationConstant.outputsConsoleViewTitle());
this.view.setDelegate(this);
consoles = new ArrayList<>();
eventBus.addHandler(ProjectReadyEvent.TYPE, this);
}
/** Add {@code console} to the container. */
public void addConsole(final OutputConsole console) {
// check whether console for an appropriate command is already opened
OutputConsole existingOutputConsole = null;
for (final OutputConsole outputConsole : consoles) {
if (outputConsole.isFinished() && console.getTitle().equals(outputConsole.getTitle())) {
existingOutputConsole = outputConsole;
break;
}
}
if (existingOutputConsole == null) {
console.go(new AcceptsOneWidget() {
@Override
public void setWidget(IsWidget widget) {
consoles.add(console);
view.addConsole(console.getTitle(), widget);
view.showConsole(consoles.size() - 1);
}
});
} else {
// replace existing console with new one
final int existingConsoleIndex = consoles.indexOf(existingOutputConsole);
console.go(new AcceptsOneWidget() {
@Override
public void setWidget(IsWidget widget) {
// add new console in place of existing one
consoles.add(existingConsoleIndex, console);
view.insertConsole(console.getTitle(), widget, existingConsoleIndex);
// remove existing console
consoles.remove(existingConsoleIndex + 1);
view.removeConsole(existingConsoleIndex + 1);
view.showConsole(existingConsoleIndex);
}
});
}
firePropertyChange(TITLE_PROPERTY);
}
@Override
public View getView() {
return view;
}
@NotNull
@Override
public String getTitle() {
return localizationConstant.outputsConsoleViewTitle();
}
@Override
public void setVisible(boolean visible) {
view.setVisible(visible);
}
@Nullable
@Override
public SVGResource getTitleSVGImage() {
return resources.outputPartIcon();
}
@Override
public int getUnreadNotificationsCount() {
return consoles.size();
}
@Override
public String getTitleToolTip() {
return localizationConstant.outputsConsoleViewTooltip();
}
@Override
public void go(AcceptsOneWidget container) {
container.setWidget(view);
}
@Override
public void onConsoleSelected(int index) {
view.showConsole(index);
}
@Override
public void onConsoleClose(final int index) {
final OutputConsole console = consoles.get(index);
if (console.isFinished()) {
closeConsole(console);
} else {
final ConfirmCallback confirmCallback = new ConfirmCallback() {
@Override
public void accepted() {
closeConsole(console);
}
};
dialogFactory.createConfirmDialog("",
localizationConstant.outputsConsoleViewStopProcessConfirmation(console.getTitle()),
confirmCallback, null).show();
}
}
private void closeConsole(OutputConsole console) {
console.onClose();
final int index = consoles.indexOf(console);
consoles.remove(index);
view.removeConsole(index);
// activate previous console
if (index > 0) {
view.showConsole(index - 1);
}
firePropertyChange(TITLE_PROPERTY);
}
@Override
public void onProjectReady(ProjectReadyEvent event) {
firePropertyChange(TITLE_PROPERTY);
}
@Override
public void onCloseCurrentProject(CloseCurrentProjectEvent event) {
consoles.clear();
view.removeAllConsoles();
firePropertyChange(TITLE_PROPERTY);
}
}