/******************************************************************************* * 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.git.client.history; import com.google.gwt.cell.client.Cell; import com.google.gwt.cell.client.TextCell; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.cellview.client.CellTable; import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.DockLayoutPanel; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.TextArea; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.UIObject; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.view.client.SelectionChangeEvent; import com.google.gwt.view.client.SingleSelectionModel; import com.google.inject.Inject; import com.google.inject.Singleton; import org.eclipse.che.api.git.shared.Revision; import org.eclipse.che.ide.Resources; import org.eclipse.che.ide.api.parts.PartStackUIResources; import org.eclipse.che.ide.api.parts.base.BaseView; import org.eclipse.che.ide.ext.git.client.GitLocalizationConstant; import org.eclipse.che.ide.ext.git.client.GitResources; import org.vectomatic.dom.svg.ui.SVGImage; import javax.validation.constraints.NotNull; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * The implementation of {@link HistoryView}. * * @author Andrey Plotnikov * @author Vlad Zhukovskyi */ @Singleton public class HistoryViewImpl extends BaseView<HistoryView.ActionDelegate> implements HistoryView { interface HistoryViewImplUiBinder extends UiBinder<Widget, HistoryViewImpl> { } @UiField DockLayoutPanel dataCommitBPanel; @UiField DockLayoutPanel revisionCommitBPanel; @UiField HTML compareType; @UiField TextBox commitARevision; @UiField TextBox commitADate; @UiField TextBox commitBRevision; @UiField TextBox commitBDate; @UiField TextArea editor; @UiField(provided = true) CellTable<Revision> commits; @UiField Button btnRefresh; @UiField Button btnProjectChanges; @UiField Button btnResourceChanges; @UiField Button btnDiffWithIndex; @UiField Button btnDiffWithWorkTree; @UiField Button btnDiffWithPrevCommit; @UiField(provided = true) final GitResources res; @UiField(provided = true) final GitLocalizationConstant locale; /** * Create view. * * @param resources * @param locale * @param partStackUIResources */ @Inject protected HistoryViewImpl(final GitResources resources, final GitLocalizationConstant locale, final PartStackUIResources partStackUIResources, final Resources res, final HistoryViewImplUiBinder uiBinder) { super(partStackUIResources); this.res = resources; this.locale = locale; createCommitsTable(res); setContentWidget(uiBinder.createAndBindUi(this)); minimizeButton.ensureDebugId("git-showHistory-minimizeBut"); btnProjectChanges.getElement().appendChild(new SVGImage(resources.projectLevel()).getElement()); btnResourceChanges.getElement().appendChild(new SVGImage(resources.resourceLevel()).getElement()); btnDiffWithIndex.getElement().appendChild(new SVGImage(resources.diffIndex()).getElement()); btnDiffWithWorkTree.getElement().appendChild(new SVGImage(resources.diffWorkTree()).getElement()); btnDiffWithPrevCommit.getElement().appendChild(new SVGImage(resources.diffPrevVersion()).getElement()); btnRefresh.getElement().appendChild(new SVGImage(resources.refresh()).getElement()); } /** Creates table what contains list of available commits. * @param res*/ private void createCommitsTable(Resources res) { commits = new CellTable<Revision>(15, res); Column<Revision, String> dateColumn = new Column<Revision, String>(new TextCell()) { @Override public String getValue(Revision revision) { return DateTimeFormat.getFormat(DateTimeFormat.PredefinedFormat.DATE_TIME_MEDIUM).format( new Date((long)revision.getCommitTime())); } @Override public void render(Cell.Context context, Revision revision, SafeHtmlBuilder sb) { sb.appendHtmlConstant("<div id=\"" + UIObject.DEBUG_ID_PREFIX + "git-showHistory-table-" + context.getIndex() + "\">"); super.render(context, revision, sb); } }; Column<Revision, String> commiterColumn = new Column<Revision, String>(new TextCell()) { @Override public String getValue(Revision revision) { if (revision.getCommitter() == null) { return ""; } return revision.getCommitter().getName(); } }; Column<Revision, String> commentColumn = new Column<Revision, String>(new TextCell()) { @Override public String getValue(Revision revision) { return revision.getMessage(); } }; commits.addColumn(dateColumn, locale.commitGridDate()); commits.setColumnWidth(dateColumn, "20%"); commits.addColumn(commiterColumn, locale.commitGridCommiter()); commits.setColumnWidth(commiterColumn, "30%"); commits.addColumn(commentColumn, locale.commitGridComment()); commits.setColumnWidth(commentColumn, "50%"); final SingleSelectionModel<Revision> selectionModel = new SingleSelectionModel<Revision>(); selectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() { @Override public void onSelectionChange(SelectionChangeEvent event) { Revision selectedObject = selectionModel.getSelectedObject(); delegate.onRevisionSelected(selectedObject); } }); commits.setSelectionModel(selectionModel); } /** {@inheritDoc} */ @Override public void setRevisions(@NotNull List<Revision> revisions) { // Wraps Array in java.util.List List<Revision> list = new ArrayList<>(); for (Revision revision : revisions) { list.add(revision); } this.commits.setRowData(list); } /** {@inheritDoc} */ @Override public void selectProjectChangesButton(boolean selected) { btnProjectChanges.setEnabled(!selected); } /** {@inheritDoc} */ @Override public void selectResourceChangesButton(boolean selected) { btnResourceChanges.setEnabled(!selected); } /** {@inheritDoc} */ @Override public void selectDiffWithIndexButton(boolean selected) { btnDiffWithIndex.setEnabled(!selected); } /** {@inheritDoc} */ @Override public void selectDiffWithWorkingTreeButton(boolean selected) { btnDiffWithWorkTree.setEnabled(!selected); } /** {@inheritDoc} */ @Override public void selectDiffWithPrevVersionButton(boolean selected) { btnDiffWithPrevCommit.setEnabled(!selected); } /** {@inheritDoc} */ @Override public void setCommitADate(@NotNull String date) { commitADate.setText(date); } /** {@inheritDoc} */ @Override public void setCommitBDate(@NotNull String date) { commitBDate.setText(date); } /** {@inheritDoc} */ @Override public void setCommitARevision(@NotNull String revision) { commitARevision.setText(revision); } /** {@inheritDoc} */ @Override public void setCommitBRevision(@NotNull String revision) { commitBRevision.setText(revision); } /** {@inheritDoc} */ @Override public void setCompareType(@NotNull String type) { compareType.setHTML(type); } /** {@inheritDoc} */ @Override public void setDiffContext(@NotNull String diffContext) { editor.setText(diffContext); } /** {@inheritDoc} */ @Override public void setCommitBPanelVisible(boolean visible) { revisionCommitBPanel.setVisible(visible); dataCommitBPanel.setVisible(visible); } /** {@inheritDoc} */ @Override public void clear() { dataCommitBPanel.clear(); revisionCommitBPanel.clear(); commitARevision.setText(""); commitBRevision.setText(""); commitADate.setText(""); commitBDate.setText(""); compareType.setText(""); setDiffContext(""); List<Revision> list = new ArrayList<Revision>(); commits.setRowData(list); } @UiHandler("btnRefresh") public void onRefreshClicked(ClickEvent event) { delegate.onRefreshClicked(); } @UiHandler("btnProjectChanges") public void onProjectChangesClick(ClickEvent event) { delegate.onProjectChangesClicked(); } @UiHandler("btnResourceChanges") public void onResourceChangesClicked(ClickEvent event) { delegate.onResourceChangesClicked(); } @UiHandler("btnDiffWithIndex") public void onDiffWithIndexClicked(ClickEvent event) { delegate.onDiffWithIndexClicked(); } @UiHandler("btnDiffWithWorkTree") public void onDiffWithWorkTreeClicked(ClickEvent event) { delegate.onDiffWithWorkTreeClicked(); } @UiHandler("btnDiffWithPrevCommit") public void onDiffWithPrevCommitClicked(ClickEvent event) { delegate.onDiffWithPrevCommitClicked(); } }