blob: 6c39dc1c95761f4583752265d7a0d21dc8960148 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 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:
* Ericsson - initial API and implementation
*******************************************************************************/
package org.eclipse.egerrit.internal.ui.table.provider;
import java.util.ArrayList;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.observable.Observables;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.egerrit.internal.core.GerritClient;
import org.eclipse.egerrit.internal.model.ChangeInfo;
import org.eclipse.egerrit.internal.model.ModelPackage;
import org.eclipse.egerrit.internal.model.RevisionInfo;
import org.eclipse.egerrit.internal.ui.tabs.ObservableCollector;
import org.eclipse.egerrit.internal.ui.utils.DataConverter;
import org.eclipse.emf.databinding.EMFProperties;
import org.eclipse.emf.databinding.FeaturePath;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
/**
* This class handle the user selection of a patch set
*/
public class PatchSetHandlerProvider {
private ChangeInfo fChangeInfo;
private GerritClient fGerritClient;
private Label patchsetlabel;
private DataBindingContext bindingContext = new DataBindingContext();
private ObservableCollector observableCollector;
/**
* Create a button and add all handling for this patchset selection button
*
* @param parent
* @param changeInfo
* @param fGerritClient
* @return Button
*/
public Button create(Composite parent, ChangeInfo changeInfo, GerritClient gerritClient) {
this.fChangeInfo = changeInfo;
this.fGerritClient = gerritClient;
patchsetlabel = new Label(parent, SWT.NONE);
Button fButtonPatchSet = new Button(parent, SWT.DROP_DOWN | SWT.ARROW | SWT.DOWN);
fButtonPatchSet.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
fButtonPatchSet.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
MenuManager mgr = new MenuManager();
fillMenuItemForChangeInfo(mgr);
mgr.createContextMenu(parent).setVisible(true);
}
});
patchsetSelectionBinding();
return fButtonPatchSet;
}
private void fillMenuItemForChangeInfo(MenuManager menu) {
ArrayList<RevisionInfo> revisions = new ArrayList<>(fChangeInfo.getRevisions().values());
revisions.sort((o1, o2) -> o2.get_number() - o1.get_number());
revisions.stream().forEach(rev -> menu.add(new SwitchCurrentPathsetAction(fChangeInfo, rev)));
}
/**
* Add binding to this patch set button
*/
private void patchsetSelectionBinding() {
FeaturePath selectRevision = FeaturePath.fromList(ModelPackage.Literals.CHANGE_INFO__USER_SELECTED_REVISION);
IObservableValue observerValue = EMFProperties.value(selectRevision).observe(fChangeInfo);
bindingContext.bindValue(Observables.observeDelayedValue(1000, WidgetProperties.text().observe(patchsetlabel)),
Observables.observeDelayedValue(1000, observerValue), null,
new UpdateValueStrategy().setConverter(DataConverter.patchSetSelected(fChangeInfo, fGerritClient)));
//See when a REBASE occurs, the current revision is updated
IObservableValue observerRevisionsValue = EMFProperties
.value(ModelPackage.Literals.CHANGE_INFO__CURRENT_REVISION).observe(fChangeInfo);
bindingContext.bindValue(WidgetProperties.text().observe(patchsetlabel), observerRevisionsValue, null,
new UpdateValueStrategy().setConverter(DataConverter.patchSetSelected(fChangeInfo, fGerritClient)));
observableCollector = new ObservableCollector(bindingContext);
}
public void dispose() {
observableCollector.dispose();
bindingContext.dispose();
}
}