blob: a61bccc82dda4e8f4ded61f9b5844b8a8a18d505 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 Ericsson AB.
* 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:
* Jacques Bouthillier - initial API and implementation
*******************************************************************************/
package org.eclipse.egerrit.internal.ui.tabs;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.map.IObservableMap;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.property.Properties;
import org.eclipse.core.databinding.property.value.IValueProperty;
import org.eclipse.egerrit.internal.core.GerritClient;
import org.eclipse.egerrit.internal.model.ChangeInfo;
import org.eclipse.egerrit.internal.model.ChangeMessageInfo;
import org.eclipse.egerrit.internal.model.ModelPackage;
import org.eclipse.egerrit.internal.ui.table.UIFilesTable;
import org.eclipse.egerrit.internal.ui.table.UIHistoryTable;
import org.eclipse.egerrit.internal.ui.table.provider.HistoryTableLabelProvider;
import org.eclipse.egerrit.internal.ui.utils.DataConverter;
import org.eclipse.egerrit.internal.ui.utils.Messages;
import org.eclipse.emf.databinding.EMFProperties;
import org.eclipse.emf.databinding.FeaturePath;
import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
import org.eclipse.jface.databinding.viewers.ViewersObservables;
import org.eclipse.jface.text.hyperlink.IHyperlinkDetector;
import org.eclipse.jface.text.hyperlink.IHyperlinkPresenter;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.text.source.SourceViewerConfiguration;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
/**
* This class is used in the editor to handle the Gerrit history view <a>http://git.eclipse.org/r</a>
*
* @since 1.0
*/
public class HistoryTabView {
private static final String HISTORY_FILES = "egerrit.HistoryFiles"; //$NON-NLS-1$
private TableViewer tableHistoryViewer;
private TextViewerWithLinks msgTextData;
private GerritClient fGerritClient;
private ChangeInfo fChangeInfo;
private UIFilesTable tableUIFiles;
private DataBindingContext dataBindingContext = new DataBindingContext();
private ObservableCollector observableCollector = null;
/**
* The constructor.
*
* @param fChangeInfo
* @param fGerritClient
*/
public HistoryTabView(GerritClient gerritClient, ChangeInfo changeInfo) {
this.fGerritClient = gerritClient;
this.fChangeInfo = changeInfo;
}
/**
* @param tabFolder
* List<ChangeMessageInfo>
*/
public void create(TabFolder tabFolder) {
createControls(tabFolder);
}
private void createControls(TabFolder tabFolder) {
TabItem tbtmHistory = new TabItem(tabFolder, SWT.NONE);
tbtmHistory.setText(Messages.HistoryTabView_0);
SashForm sashForm = new SashForm(tabFolder, SWT.VERTICAL);
tbtmHistory.setControl(sashForm);
UIHistoryTable tableUIHistory = new UIHistoryTable(fGerritClient);
tableUIHistory.createTableViewerSection(sashForm);
tableHistoryViewer = tableUIHistory.getViewer();
SashForm sashFormHorizon = new SashForm(sashForm, SWT.HORIZONTAL);
msgTextData = new TextViewerWithLinks(sashFormHorizon, SWT.BORDER | SWT.WRAP | SWT.MULTI | SWT.V_SCROLL);
msgTextData.setEditable(false);
tableUIFiles = new UIFilesTable(fGerritClient, fChangeInfo, HISTORY_FILES);
tableUIFiles.createTableViewerSection(sashFormHorizon);
//Set the % of display data.40% table and 60% for the comment message
sashFormHorizon.setWeights(new int[] { 40, 60 });
msgTextData.configure(new SourceViewerConfiguration() {
@Override
public int getHyperlinkStateMask(ISourceViewer sourceViewer) {
return SWT.NONE;
}
@Override
public IHyperlinkDetector[] getHyperlinkDetectors(ISourceViewer sourceViewer) {
return new IHyperlinkDetector[] { new HyperLinkDetector(fGerritClient, fChangeInfo) };
}
@Override
public IHyperlinkPresenter getHyperlinkPresenter(final ISourceViewer sourceViewer) {
return new HyperLinkPresenter(new RGB(0, 0, 255), sourceViewer, fGerritClient, fChangeInfo);
}
});
//Set the % of display data.40% table and 60% for the comment message
sashForm.setWeights(new int[] { 40, 60 });
bind(fChangeInfo);
}
private void bind(ChangeInfo changeInfo) {
ObservableListContentProvider contentProvider = new ObservableListContentProvider();
tableHistoryViewer.setContentProvider(contentProvider);
final FeaturePath authorName = FeaturePath.fromList(ModelPackage.Literals.CHANGE_MESSAGE_INFO__AUTHOR,
ModelPackage.Literals.ACCOUNT_INFO__NAME);
final IObservableMap[] watchedProperties = Properties.observeEach(contentProvider.getKnownElements(),
new IValueProperty[] { EMFProperties.value(ModelPackage.Literals.CHANGE_MESSAGE_INFO__DATE),
EMFProperties.value(authorName),
EMFProperties.value(ModelPackage.Literals.CHANGE_MESSAGE_INFO__MESSAGE) });
tableHistoryViewer.setLabelProvider(new HistoryTableLabelProvider(watchedProperties, fGerritClient));
tableHistoryViewer
.setInput(EMFProperties.list(ModelPackage.Literals.CHANGE_INFO__MESSAGES).observe(changeInfo));
//Hook the selection listener to display the details in the bottom section
IObservableValue selection = ViewersObservables.observeSingleSelection(tableHistoryViewer);
IObservableValue textViewerDocument = BeanProperties.value(msgTextData.getClass(), "document") //$NON-NLS-1$
.observe(Realm.getDefault(), msgTextData);
UpdateValueStrategy textToDocumentStrategy = new UpdateValueStrategy();
textToDocumentStrategy.setConverter(DataConverter.fromStringToDocument(fGerritClient));
dataBindingContext.bindValue(textViewerDocument, selection, null, textToDocumentStrategy);
//Automatically update the user selected revision as the user changes the selection
IObservableValue settableUserRevision = EMFProperties
.value(ModelPackage.Literals.CHANGE_INFO__USER_SELECTED_REVISION).observe(changeInfo);
dataBindingContext.bindValue(settableUserRevision, selection, null, new UpdateValueStrategy() {
@Override
public Object convert(Object value) {
if (value == null) {
return null;
}
//-> from the message info to the revision
ChangeMessageInfo message = (ChangeMessageInfo) value;
ChangeInfo containingChange = (ChangeInfo) message.eContainer();
return containingChange.getRevisionByNumber(message.get_revision_number());
}
});
observableCollector = new ObservableCollector(dataBindingContext);
}
public void dispose() {
observableCollector.dispose();
dataBindingContext.dispose();
tableUIFiles.dispose();
}
}