/*******************************************************************************
* 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.gwt.cell.client.AbstractCell;
import com.google.gwt.cell.client.Cell;
import com.google.gwt.cell.client.CheckboxCell;
import com.google.gwt.cell.client.CompositeCell;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.cell.client.HasCell;
import com.google.gwt.dom.client.Element;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.SelectionModel;
import com.google.gwt.view.client.TreeViewModel;
import org.eclipse.che.ide.ext.java.shared.dto.refactoring.RefactoringPreview;
import java.util.ArrayList;
import java.util.List;
/**
* A model of a tree which contains all possible refactoring changes.
*
* @author Valeriy Svydenko
*/
public class PreviewChangesModel implements TreeViewModel {
private final RefactoringPreview changes;
private final SelectionModel<RefactoringPreview> selectionModel;
private final Cell<RefactoringPreview> refactoringPreviewCell;
public PreviewChangesModel(RefactoringPreview changes,
final SelectionModel<RefactoringPreview> selectionModel,
final PreviewView.ActionDelegate delegate) {
this.changes = changes;
this.selectionModel = selectionModel;
List<HasCell<RefactoringPreview, ?>> hasCells = new ArrayList<>();
hasCells.add(new HasCell<RefactoringPreview, Boolean>() {
private CheckboxCell cell = new CheckboxCell(false, false);
@Override
public Cell<Boolean> getCell() {
return cell;
}
@Override
public FieldUpdater<RefactoringPreview, Boolean> getFieldUpdater() {
return new FieldUpdater<RefactoringPreview, Boolean>() {
@Override
public void update(int index, RefactoringPreview object, Boolean value) {
object.setEnabled(value);
delegate.onEnabledStateChanged(object);
}
};
}
@Override
public Boolean getValue(RefactoringPreview object) {
return object.isEnabled();
}
});
hasCells.add(new HasCell<RefactoringPreview, RefactoringPreview>() {
private RefactoringPreviewCell cell = new RefactoringPreviewCell();
@Override
public Cell<RefactoringPreview> getCell() {
return cell;
}
@Override
public FieldUpdater<RefactoringPreview, RefactoringPreview> getFieldUpdater() {
return null;
}
@Override
public RefactoringPreview getValue(RefactoringPreview object) {
return object;
}
});
refactoringPreviewCell = new CompositeCell<RefactoringPreview>(hasCells) {
@Override
public void render(Context context, RefactoringPreview value, SafeHtmlBuilder sb) {
sb.appendHtmlConstant("<div style=\"display: inline-flex\">");
super.render(context, value, sb);
sb.appendHtmlConstant("</div>");
}
@Override
protected Element getContainerElement(Element parent) {
return parent.getFirstChildElement();
}
@Override
protected <X> void render(Context context,
RefactoringPreview value,
SafeHtmlBuilder sb,
HasCell<RefactoringPreview, X> hasCell) {
Cell<X> cell = hasCell.getCell();
sb.appendHtmlConstant("<div style=\"display: flex; align-items: center;\">");
cell.render(context, hasCell.getValue(value), sb);
sb.appendHtmlConstant("</div>");
}
};
}
/** {@inheritDoc} */
@Override
public <T> NodeInfo<?> getNodeInfo(T value) {
if (value == null) {
return new DefaultNodeInfo<>(new ListDataProvider<>(changes.getChildrens()),
refactoringPreviewCell,
selectionModel,
null);
}
return new DefaultNodeInfo<>(new ListDataProvider<>(((RefactoringPreview)value).getChildrens()),
refactoringPreviewCell,
selectionModel,
null);
}
/** {@inheritDoc} */
@Override
public boolean isLeaf(Object value) {
return value instanceof RefactoringPreview && ((RefactoringPreview)value).getChildrens().isEmpty();
}
/**Class for rendering the information about {@link RefactoringPreview}*/
private class RefactoringPreviewCell extends AbstractCell<RefactoringPreview> {
@Override
public void render(Context context, RefactoringPreview value, SafeHtmlBuilder sb) {
//TODO add an respective image for current change by value.getImage()
sb.appendEscaped(" ").appendEscaped(value.getText());
}
}
}