blob: 9375f532a47ca631b67e1c9d0069a9e9d994f236 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
* Sebastian Davids <sdavids@gmx.de> - bug 54630
*******************************************************************************/
package org.eclipse.team.internal.ui.synchronize;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.team.internal.ui.TeamUIMessages;
import org.eclipse.team.internal.ui.Utils;
import org.eclipse.team.ui.synchronize.ISynchronizeParticipant;
/**
* A composite that allows editing a subscriber refresh schedule. A validator can be used to allow
* containers to show page completion.
*
* @since 3.0
*/
public class ConfigureSynchronizeScheduleComposite extends Composite {
private SubscriberRefreshSchedule schedule;
private Button userRefreshOnly;
private Button enableBackgroundRefresh;
private Text time;
private Combo hoursOrSeconds;
private IPageValidator validator;
public ConfigureSynchronizeScheduleComposite(Composite parent, SubscriberRefreshSchedule schedule, IPageValidator validator) {
super(parent, SWT.NONE);
this.schedule = schedule;
this.validator = validator;
createMainDialogArea(parent);
}
private void initializeValues() {
boolean enableBackground = schedule.isEnabled();
boolean hours = false;
userRefreshOnly.setSelection(! enableBackground);
enableBackgroundRefresh.setSelection(enableBackground);
long seconds = schedule.getRefreshInterval();
if(seconds <= 60) {
seconds = 60;
}
long minutes = seconds / 60;
if(minutes >= 60) {
minutes = minutes / 60;
hours = true;
}
hoursOrSeconds.select(hours ? 0 : 1);
time.setText(Long.toString(minutes));
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
protected void createMainDialogArea(Composite parent) {
GC gc = new GC(parent);
gc.setFont(JFaceResources.getDialogFont());
FontMetrics fontMetrics = gc.getFontMetrics();
gc.dispose();
final GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 2;
gridLayout.marginHeight = 0;
gridLayout.marginWidth = 0;
gridLayout.horizontalSpacing = Dialog.convertHorizontalDLUsToPixels(fontMetrics, IDialogConstants.HORIZONTAL_SPACING);
gridLayout.verticalSpacing = Dialog.convertVerticalDLUsToPixels(fontMetrics, IDialogConstants.VERTICAL_SPACING);
setLayout(gridLayout);
setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
Composite area = this;
createWrappingLabel(area, NLS.bind(TeamUIMessages.ConfigureRefreshScheduleDialog_1, new String[] { Utils.shortenText(SynchronizeView.MAX_NAME_LENGTH, schedule.getParticipant().getName()) }), 0, 2);
{
final Label label = new Label(area, SWT.WRAP);
final GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = 2;
label.setLayoutData(gridData);
label.setText(NLS.bind(TeamUIMessages.ConfigureRefreshScheduleDialog_1a, new String[] { SubscriberRefreshSchedule.refreshEventAsString(schedule.getLastRefreshEvent()) }));
}
{
userRefreshOnly = new Button(area, SWT.RADIO);
final GridData gridData = new GridData();
gridData.horizontalSpan = 2;
userRefreshOnly.setLayoutData(gridData);
userRefreshOnly.setText(TeamUIMessages.ConfigureRefreshScheduleDialog_2);
userRefreshOnly.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
updateEnablements();
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
}
{
enableBackgroundRefresh = new Button(area, SWT.RADIO);
final GridData gridData = new GridData();
gridData.horizontalSpan = 2;
enableBackgroundRefresh.setLayoutData(gridData);
enableBackgroundRefresh.setText(TeamUIMessages.ConfigureRefreshScheduleDialog_3);
enableBackgroundRefresh.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
updateEnablements();
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
}
{
final Composite composite = new Composite(area, SWT.NONE);
final GridData gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.VERTICAL_ALIGN_BEGINNING);
gridData.horizontalSpan = 2;
composite.setLayoutData(gridData);
final GridLayout gridLayout_1 = new GridLayout();
gridLayout_1.numColumns = 3;
gridLayout_1.marginWidth = 0;
gridLayout_1.marginHeight = 0;
gridLayout_1.horizontalSpacing = Dialog.convertHorizontalDLUsToPixels(fontMetrics, IDialogConstants.HORIZONTAL_SPACING);
gridLayout_1.verticalSpacing = Dialog.convertVerticalDLUsToPixels(fontMetrics, IDialogConstants.VERTICAL_SPACING);
composite.setLayout(gridLayout_1);
{
final Label label = new Label(composite, SWT.NONE);
label.setText(TeamUIMessages.ConfigureRefreshScheduleDialog_4);
}
{
time = new Text(composite, SWT.BORDER | SWT.RIGHT);
final GridData gridData_1 = new GridData();
gridData_1.widthHint = 35;
time.setLayoutData(gridData_1);
time.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateEnablements();
}
});
time.addVerifyListener(new VerifyListener() {
public void verifyText(VerifyEvent e) {
String string = e.text;
char [] chars = new char [string.length ()];
string.getChars (0, chars.length, chars, 0);
for (int i=0; i<chars.length; i++) {
if (!('0' <= chars [i] && chars [i] <= '9')) {
e.doit = false;
return;
}
}
}
});
}
{
hoursOrSeconds = new Combo(composite, SWT.READ_ONLY);
hoursOrSeconds.setItems(new String[] { TeamUIMessages.ConfigureRefreshScheduleDialog_5, TeamUIMessages.ConfigureRefreshScheduleDialog_6 }); //
hoursOrSeconds.setLayoutData(new GridData());
}
}
initializeValues();
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
public void saveValues() {
int hours = hoursOrSeconds.getSelectionIndex();
try {
long seconds = Long.parseLong(time.getText());
if(hours == 0) {
seconds = seconds * 3600;
} else {
seconds = seconds * 60;
}
schedule.setRefreshInterval(seconds);
} catch (NumberFormatException e) {
// keep old value
}
if(schedule.isEnabled() != enableBackgroundRefresh.getSelection()) {
schedule.setEnabled(enableBackgroundRefresh.getSelection(), true /* allow to start */);
}
// update schedule
ISynchronizeParticipant participant = schedule.getParticipant();
if (!participant.isPinned() && schedule.isEnabled()) {
participant.setPinned(MessageDialog.openQuestion(getShell(),
NLS.bind(TeamUIMessages.ConfigureSynchronizeScheduleComposite_0, new String[] { Utils.getTypeName(participant) }),
NLS.bind(TeamUIMessages.ConfigureSynchronizeScheduleComposite_1, new String[] { Utils.getTypeName(participant) })));
}
schedule.getRefreshable().setRefreshSchedule(schedule);
}
/* (non-Javadoc)
* @see org.eclipse.team.internal.ui.dialogs.DetailsDialog#updateEnablements()
*/
public void updateEnablements() {
if (userRefreshOnly.getSelection()) {
validator.setComplete(null);
} else {
try {
long number = Long.parseLong(time.getText());
if(number <= 0) {
validator.setComplete(TeamUIMessages.ConfigureRefreshScheduleDialog_7);
} else {
validator.setComplete(null);
}
} catch (NumberFormatException e) {
validator.setComplete(TeamUIMessages.ConfigureRefreshScheduleDialog_8);
}
}
time.setEnabled(enableBackgroundRefresh.getSelection());
hoursOrSeconds.setEnabled(enableBackgroundRefresh.getSelection());
}
private Label createWrappingLabel(Composite parent, String text, int indent, int horizontalSpan) {
Label label = new Label(parent, SWT.LEFT | SWT.WRAP);
label.setText(text);
GridData data = new GridData();
data.horizontalSpan = horizontalSpan;
data.horizontalAlignment = GridData.FILL;
data.horizontalIndent = indent;
data.grabExcessHorizontalSpace = true;
data.widthHint = 400;
label.setLayoutData(data);
return label;
}
}