/******************************************************************************* * Copyright (c) 2004, 2013 Tasktop Technologies 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: * Tasktop Technologies - initial API and implementation * Abner Ballardo - fix for bug 276113 *******************************************************************************/ package org.eclipse.mylyn.internal.tasks.ui.preferences; import java.io.File; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.mylyn.commons.core.CommonMessages; import org.eclipse.mylyn.commons.core.StatusHandler; import org.eclipse.mylyn.commons.ui.CommonImages; import org.eclipse.mylyn.commons.ui.compatibility.CommonColors; import org.eclipse.mylyn.internal.monitor.ui.ActivityContextManager; import org.eclipse.mylyn.internal.monitor.ui.MonitorUiPlugin; import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants; import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; import org.eclipse.mylyn.internal.tasks.ui.actions.RestoreTaskListAction; import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal; import org.eclipse.mylyn.tasks.ui.editors.TaskEditor; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; 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.Control; import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Spinner; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import org.eclipse.ui.dialogs.PreferenceLinkArea; import org.eclipse.ui.forms.events.ExpansionAdapter; import org.eclipse.ui.forms.events.ExpansionEvent; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.events.IHyperlinkListener; import org.eclipse.ui.forms.widgets.ExpandableComposite; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Hyperlink; import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import com.google.common.collect.ImmutableMap; /** * @author Mik Kersten * @author Rob Elves * @author David Green */ public class TasksUiPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { public static final String ID = "org.eclipse.mylyn.tasks.ui.preferences"; //$NON-NLS-1$ private static final String FORWARDSLASH = "/"; //$NON-NLS-1$ private static final String BACKSLASH_MULTI = "\\\\"; //$NON-NLS-1$ private static final int MS_MINUTES = 60 * 1000; private static BiMap<String, Integer> SCHEDULE_TIME_MAP = HashBiMap .create(ImmutableMap.of(ITasksUiPreferenceConstants.SCHEDULE_NEW_TASKS_FOR_THIS_WEEK, 0, ITasksUiPreferenceConstants.SCHEDULE_NEW_TASKS_FOR_TOMORROW, 1, ITasksUiPreferenceConstants.SCHEDULE_NEW_TASKS_FOR_TODAY, 2, ITasksUiPreferenceConstants.SCHEDULE_NEW_TASKS_FOR_NOT_SCHEDULED, 3)); private Button useRichEditor; private Button editorHighlightsCurrentLine; private Button useWebBrowser; private Text fullSyncScheduleTime; private Text relevantTasksSyncScheduleTime; private Button enableFullTaskListSynch; private Button enableRelevantTasksSynch; private Text taskDirectoryText; private Button browse; private Button notificationEnabledButton; private final FormToolkit toolkit; private Spinner timeoutMinutes; private Button timeoutEnabledButton; private ExpandableComposite advancedComposite; private Combo weekStartCombo; private Combo scheduleNewTasksCombo; private Button activityTrackingEnabledButton; private Label timeoutLabel1; private Label timeoutLabel2; private Button taskListTooltipEnabledButton; private Button showTaskTrimButton; private Button taskListServiceMessageEnabledButton; public TasksUiPreferencePage() { super(); setPreferenceStore(TasksUiPlugin.getDefault().getPreferenceStore()); toolkit = new FormToolkit(Display.getCurrent()); } @Override protected Control createContents(Composite parent) { Composite container = new Composite(parent, SWT.NULL); GridLayout layout = new GridLayout(1, false); container.setLayout(layout); createTaskRefreshScheduleGroup(container); createSchedulingGroup(container); createTaskNavigationGroup(container); createTaskListGroup(container); createTaskEditorGroup(container); Group taskActivityGroup = createTaskActivityGroup(container); if (!TasksUiPlugin.getTaskActivityMonitor().isEnabled()) { // hide controls but create them to avoid NPEs taskActivityGroup.setVisible(false); ((GridData) taskActivityGroup.getLayoutData()).exclude = true; } Composite advanced = createAdvancedSection(container); createTaskDataControl(advanced); if (getContainer() instanceof IWorkbenchPreferenceContainer) { String message = Messages.TasksUiPreferencePage_See_X_for_configuring_Task_List_colors; new PreferenceLinkArea(advanced, SWT.NONE, "org.eclipse.ui.preferencePages.ColorsAndFonts", message, //$NON-NLS-1$ (IWorkbenchPreferenceContainer) getContainer(), null); } createLinks(advanced); updateRefreshGroupEnablements(); applyDialogFont(container); return container; } private void createLinks(Composite container) { Hyperlink link = new Hyperlink(container, SWT.NULL); link.setForeground(CommonColors.HYPERLINK_WIDGET); link.setUnderlined(true); link.setText(Messages.TasksUiPreferencePage_Use_the_Restore_dialog_to_recover_missing_tasks); link.addHyperlinkListener(new IHyperlinkListener() { public void linkActivated(HyperlinkEvent e) { getShell().close(); new RestoreTaskListAction().run(); } public void linkEntered(HyperlinkEvent e) { // ignore } public void linkExited(HyperlinkEvent e) { // ignore } }); } private Composite createAdvancedSection(Composite container) { advancedComposite = toolkit.createExpandableComposite(container, ExpandableComposite.COMPACT | ExpandableComposite.TWISTIE | ExpandableComposite.TITLE_BAR); advancedComposite.setFont(container.getFont()); advancedComposite.setBackground(container.getBackground()); advancedComposite.setText(Messages.TasksUiPreferencePage_Advanced); advancedComposite.setLayout(new GridLayout(1, false)); advancedComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); advancedComposite.addExpansionListener(new ExpansionAdapter() { @Override public void expansionStateChanged(ExpansionEvent e) { getControl().getShell().pack(); } }); Composite advanced = new Composite(advancedComposite, SWT.NONE); advanced.setLayout(new GridLayout(1, false)); advancedComposite.setClient(advanced); return advanced; } public void init(IWorkbench workbench) { // TODO Auto-generated method stub } @Override public boolean performOk() { getPreferenceStore().setValue(ITasksUiPreferenceConstants.NOTIFICATIONS_ENABLED, notificationEnabledButton.getSelection()); getPreferenceStore().setValue(ITasksUiPreferenceConstants.EDITOR_TASKS_RICH, useRichEditor.getSelection()); getPreferenceStore().setValue(ITasksUiPreferenceConstants.EDITOR_CURRENT_LINE_HIGHLIGHT, editorHighlightsCurrentLine.getSelection()); getPreferenceStore().setValue(ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_ENABLED, enableFullTaskListSynch.getSelection()); getPreferenceStore().setValue(ITasksUiPreferenceConstants.RELEVANT_SYNCH_SCHEDULE_ENABLED, enableRelevantTasksSynch.getSelection()); String miliseconds = toMillisecondsString(fullSyncScheduleTime.getText()); getPreferenceStore().setValue(ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_MILISECONDS, miliseconds); miliseconds = toMillisecondsString(relevantTasksSyncScheduleTime.getText()); getPreferenceStore().setValue(ITasksUiPreferenceConstants.RELEVANT_TASKS_SCHEDULE_MILISECONDS, miliseconds); getPreferenceStore().setValue(ITasksUiPreferenceConstants.TASK_LIST_TOOL_TIPS_ENABLED, taskListTooltipEnabledButton.getSelection()); getPreferenceStore().setValue(ITasksUiPreferenceConstants.SERVICE_MESSAGES_ENABLED, taskListServiceMessageEnabledButton.getSelection()); getPreferenceStore().setValue(ITasksUiPreferenceConstants.SHOW_TRIM, showTaskTrimButton.getSelection()); getPreferenceStore().setValue(ITasksUiPreferenceConstants.WEEK_START_DAY, getWeekStartValue()); getPreferenceStore().setValue(ITasksUiPreferenceConstants.SCHEDULE_NEW_TASKS_FOR, getScheduleNewTasksValue()); MonitorUiPlugin.getDefault().getPreferenceStore().setValue(ActivityContextManager.ACTIVITY_TIMEOUT_ENABLED, timeoutEnabledButton.getSelection()); MonitorUiPlugin.getDefault().getPreferenceStore().setValue(ActivityContextManager.ACTIVITY_TIMEOUT, timeoutMinutes.getSelection() * (60 * 1000)); MonitorUiPlugin.getDefault().getPreferenceStore().setValue(MonitorUiPlugin.ACTIVITY_TRACKING_ENABLED, activityTrackingEnabledButton.getSelection()); String taskDirectory = taskDirectoryText.getText(); taskDirectory = taskDirectory.replaceAll(BACKSLASH_MULTI, FORWARDSLASH); if (!taskDirectory.equals(TasksUiPlugin.getDefault().getDataDirectory())) { if (checkForExistingTasklist(taskDirectory)) { Exception exception = null; try { TasksUiPlugin.getDefault().setDataDirectory(taskDirectory); } catch (CoreException e) { exception = e; StatusHandler.log(e.getStatus()); MessageDialog.openError(getShell(), Messages.TasksUiPreferencePage_Task_Data_Directory_Error, Messages.TasksUiPreferencePage_Error_applying_Task_List_data_directory_changes); } catch (OperationCanceledException ce) { exception = ce; } if (exception != null && !taskDirectoryText.isDisposed()) { String originalDirectory = TasksUiPlugin.getDefault().getDefaultDataDirectory(); if (!taskDirectory.equals(originalDirectory)) { taskDirectoryText.setText(originalDirectory); } } } else { taskDirectoryText.setFocus(); return false; } } return true; } private String toMillisecondsString(String minutesString) { return Long.toString(60 * 1000 * Long.parseLong(minutesString)); } private int getWeekStartValue() { return weekStartCombo.getSelectionIndex() + 1; } private String getScheduleNewTasksValue() { int index = scheduleNewTasksCombo.getSelectionIndex(); return SCHEDULE_TIME_MAP.inverse().get(index); } @Override public boolean performCancel() { taskDirectoryText.setText(TasksUiPlugin.getDefault().getDefaultDataDirectory()); notificationEnabledButton .setSelection(getPreferenceStore().getBoolean(ITasksUiPreferenceConstants.NOTIFICATIONS_ENABLED)); useRichEditor.setSelection(getPreferenceStore().getBoolean(ITasksUiPreferenceConstants.EDITOR_TASKS_RICH)); editorHighlightsCurrentLine.setSelection( getPreferenceStore().getBoolean(ITasksUiPreferenceConstants.EDITOR_CURRENT_LINE_HIGHLIGHT)); String repositorySyncMinutes = toMinutesString( getPreferenceStore().getLong(ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_MILISECONDS)); String relevantSyncMinutes = toMinutesString( getPreferenceStore().getLong(ITasksUiPreferenceConstants.RELEVANT_TASKS_SCHEDULE_MILISECONDS)); boolean shouldSyncTaskList = getPreferenceStore() .getBoolean(ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_ENABLED); boolean shouldSyncRelevantTasks = getPreferenceStore() .getBoolean(ITasksUiPreferenceConstants.RELEVANT_SYNCH_SCHEDULE_ENABLED); enableFullTaskListSynch.setSelection(shouldSyncTaskList); enableRelevantTasksSynch.setSelection(shouldSyncRelevantTasks); fullSyncScheduleTime.setText(repositorySyncMinutes); relevantTasksSyncScheduleTime.setText(relevantSyncMinutes); taskListTooltipEnabledButton .setSelection(getPreferenceStore().getBoolean(ITasksUiPreferenceConstants.TASK_LIST_TOOL_TIPS_ENABLED)); taskListServiceMessageEnabledButton .setSelection(getPreferenceStore().getBoolean(ITasksUiPreferenceConstants.SERVICE_MESSAGES_ENABLED)); showTaskTrimButton.setSelection(getPreferenceStore().getBoolean(ITasksUiPreferenceConstants.SHOW_TRIM)); weekStartCombo.select(getPreferenceStore().getInt(ITasksUiPreferenceConstants.WEEK_START_DAY) - 1); String scheduleFor = getPreferenceStore().getString(ITasksUiPreferenceConstants.SCHEDULE_NEW_TASKS_FOR); scheduleNewTasksCombo.select(SCHEDULE_TIME_MAP.getOrDefault(scheduleFor, 0)); int minutes = MonitorUiPlugin.getDefault().getPreferenceStore().getInt(ActivityContextManager.ACTIVITY_TIMEOUT) / MS_MINUTES; timeoutMinutes.setSelection(minutes); timeoutEnabledButton.setSelection(MonitorUiPlugin.getDefault() .getPreferenceStore() .getBoolean(ActivityContextManager.ACTIVITY_TIMEOUT_ENABLED)); activityTrackingEnabledButton.setSelection(MonitorUiPlugin.getDefault() .getPreferenceStore() .getBoolean(MonitorUiPlugin.ACTIVITY_TRACKING_ENABLED)); return true; } @Override public void performDefaults() { super.performDefaults(); taskDirectoryText.setText(TasksUiPlugin.getDefault().getDefaultDataDirectory()); notificationEnabledButton.setSelection( getPreferenceStore().getDefaultBoolean(ITasksUiPreferenceConstants.NOTIFICATIONS_ENABLED)); useRichEditor .setSelection(getPreferenceStore().getDefaultBoolean(ITasksUiPreferenceConstants.EDITOR_TASKS_RICH)); editorHighlightsCurrentLine.setSelection( getPreferenceStore().getDefaultBoolean(ITasksUiPreferenceConstants.EDITOR_CURRENT_LINE_HIGHLIGHT)); taskListTooltipEnabledButton.setSelection( getPreferenceStore().getDefaultBoolean(ITasksUiPreferenceConstants.TASK_LIST_TOOL_TIPS_ENABLED)); taskListServiceMessageEnabledButton.setSelection( getPreferenceStore().getDefaultBoolean(ITasksUiPreferenceConstants.SERVICE_MESSAGES_ENABLED)); showTaskTrimButton.setSelection(getPreferenceStore().getDefaultBoolean(ITasksUiPreferenceConstants.SHOW_TRIM)); enableFullTaskListSynch.setSelection( getPreferenceStore().getDefaultBoolean(ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_ENABLED)); enableRelevantTasksSynch.setSelection( getPreferenceStore().getDefaultBoolean(ITasksUiPreferenceConstants.RELEVANT_SYNCH_SCHEDULE_ENABLED)); fullSyncScheduleTime.setText(toMinutesString(getPreferenceStore() .getDefaultLong(ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_MILISECONDS))); relevantTasksSyncScheduleTime.setText(toMinutesString( getPreferenceStore().getDefaultLong(ITasksUiPreferenceConstants.RELEVANT_TASKS_SCHEDULE_MILISECONDS))); weekStartCombo.select(getPreferenceStore().getDefaultInt(ITasksUiPreferenceConstants.WEEK_START_DAY) - 1); String defaultScheduleFor = getPreferenceStore() .getDefaultString(ITasksUiPreferenceConstants.SCHEDULE_NEW_TASKS_FOR); scheduleNewTasksCombo.select(SCHEDULE_TIME_MAP.getOrDefault(defaultScheduleFor, 0)); int activityTimeoutMinutes = MonitorUiPlugin.getDefault() .getPreferenceStore() .getDefaultInt(ActivityContextManager.ACTIVITY_TIMEOUT) / MS_MINUTES; timeoutMinutes.setSelection(activityTimeoutMinutes); timeoutEnabledButton.setSelection(MonitorUiPlugin.getDefault() .getPreferenceStore() .getDefaultBoolean(ActivityContextManager.ACTIVITY_TIMEOUT_ENABLED)); activityTrackingEnabledButton.setSelection(MonitorUiPlugin.getDefault() .getPreferenceStore() .getDefaultBoolean(MonitorUiPlugin.ACTIVITY_TRACKING_ENABLED)); updateRefreshGroupEnablements(); } private void createTaskRefreshScheduleGroup(Composite parent) { Group group = new Group(parent, SWT.SHADOW_ETCHED_IN); group.setText(Messages.TasksUiPreferencePage_Synchronization); group.setLayout(new GridLayout(1, false)); group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Composite backgroundSync = new Composite(group, SWT.NULL); GridLayoutFactory.swtDefaults().numColumns(4).equalWidth(false).margins(0, 0).applyTo(backgroundSync); //Enabled background synchronization enableFullTaskListSynch = new Button(backgroundSync, SWT.CHECK); enableFullTaskListSynch.setText(Messages.TasksUiPreferencePage_Synchronize_Task_List); enableFullTaskListSynch.setSelection( getPreferenceStore().getBoolean(ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_ENABLED)); enableFullTaskListSynch.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { updateRefreshGroupEnablements(); } public void widgetDefaultSelected(SelectionEvent e) { } }); GridDataFactory.defaultsFor(enableFullTaskListSynch).span(4, 1).applyTo(enableFullTaskListSynch); //Synchronize Task List Fully new Label(backgroundSync, SWT.NONE).setText(Messages.TasksUiPreferencePage_Synchronize_Queries); fullSyncScheduleTime = createSynchronizationScheduleTextBox(backgroundSync, ITasksUiPreferenceConstants.REPOSITORY_SYNCH_SCHEDULE_MILISECONDS); new Label(backgroundSync, SWT.NONE).setText(Messages.TasksUiPreferencePage_minutes); new Label(backgroundSync, SWT.NONE); //Synchronize Relevant Tasks enableRelevantTasksSynch = new Button(backgroundSync, SWT.CHECK); enableRelevantTasksSynch.setText(Messages.TasksUiPreferencePage_Synchronize_Relevant_Tasks); enableRelevantTasksSynch.setSelection( getPreferenceStore().getBoolean(ITasksUiPreferenceConstants.RELEVANT_SYNCH_SCHEDULE_ENABLED)); enableRelevantTasksSynch.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { updateRefreshGroupEnablements(); } public void widgetDefaultSelected(SelectionEvent e) { } }); relevantTasksSyncScheduleTime = createSynchronizationScheduleTextBox(backgroundSync, ITasksUiPreferenceConstants.RELEVANT_TASKS_SCHEDULE_MILISECONDS); new Label(backgroundSync, SWT.NONE).setText(Messages.TasksUiPreferencePage_minutes); Label help = new Label(backgroundSync, SWT.NONE); help.setImage(CommonImages.getImage(CommonImages.QUESTION)); help.setToolTipText(Messages.TasksUiPreferencePage_RelevantTasksHelp); //notification notificationEnabledButton = new Button(group, SWT.CHECK); notificationEnabledButton .setText(Messages.TasksUiPreferencePage_Display_notifications_for_overdue_tasks_and_incoming_changes); notificationEnabledButton .setSelection(getPreferenceStore().getBoolean(ITasksUiPreferenceConstants.NOTIFICATIONS_ENABLED)); GridDataFactory.defaultsFor(notificationEnabledButton).span(4, 1).applyTo(notificationEnabledButton); } private Text createSynchronizationScheduleTextBox(Composite backgroundSync, String preferenceKey) { Text text = new Text(backgroundSync, SWT.BORDER | SWT.RIGHT); GridData gridDataRepo = new GridData(); gridDataRepo.widthHint = 25; text.setLayoutData(gridDataRepo); long querySyncMilliseconds = getPreferenceStore().getLong(preferenceKey); text.setText(toMinutesString(querySyncMilliseconds)); text.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { updateRefreshGroupEnablements(); } }); return text; } private void createTaskEditorGroup(Composite parent) { Group container = new Group(parent, SWT.SHADOW_ETCHED_IN); container.setLayout(new GridLayout(2, false)); container.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); container.setText(Messages.TasksUiPreferencePage_Task_Editing); useRichEditor = new Button(container, SWT.RADIO); useRichEditor.setText(Messages.TasksUiPreferencePage_Rich_Editor__Recommended_); useRichEditor.setSelection(getPreferenceStore().getBoolean(ITasksUiPreferenceConstants.EDITOR_TASKS_RICH)); useWebBrowser = new Button(container, SWT.RADIO); useWebBrowser.setText(Messages.TasksUiPreferencePage_Web_Browser); useWebBrowser.setSelection(!getPreferenceStore().getBoolean(ITasksUiPreferenceConstants.EDITOR_TASKS_RICH)); editorHighlightsCurrentLine = new Button(container, SWT.CHECK); editorHighlightsCurrentLine.setText(Messages.TasksUiPreferencePage_highlight_current_line); editorHighlightsCurrentLine.setSelection( getPreferenceStore().getBoolean(ITasksUiPreferenceConstants.EDITOR_CURRENT_LINE_HIGHLIGHT)); } private void createTaskDataControl(Composite parent) { Group taskDataGroup = new Group(parent, SWT.SHADOW_ETCHED_IN); taskDataGroup.setText(Messages.TasksUiPreferencePage_Task_Data); taskDataGroup.setLayout(new GridLayout(1, false)); taskDataGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Composite dataDirComposite = new Composite(taskDataGroup, SWT.NULL); GridLayout gridLayout = new GridLayout(3, false); gridLayout.marginWidth = 0; gridLayout.marginHeight = 0; dataDirComposite.setLayout(gridLayout); dataDirComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Label label = new Label(dataDirComposite, SWT.NULL); label.setText(Messages.TasksUiPreferencePage_Data_directory_); String taskDirectory = TasksUiPlugin.getDefault().getDataDirectory(); taskDirectory = taskDirectory.replaceAll(BACKSLASH_MULTI, FORWARDSLASH); taskDirectoryText = new Text(dataDirComposite, SWT.BORDER); taskDirectoryText.setText(taskDirectory); taskDirectoryText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); browse = new Button(dataDirComposite, SWT.TRAIL); browse.setText(Messages.TasksUiPreferencePage_Browse_); browse.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { DirectoryDialog dialog = new DirectoryDialog(getShell()); dialog.setText(Messages.TasksUiPreferencePage_Folder_Selection); dialog.setMessage(Messages.TasksUiPreferencePage_Specify_the_folder_for_tasks); String dir = taskDirectoryText.getText(); dir = dir.replaceAll(BACKSLASH_MULTI, FORWARDSLASH); dialog.setFilterPath(dir); dir = dialog.open(); if (dir == null || dir.equals("")) { //$NON-NLS-1$ return; } dir = dir.replaceAll(BACKSLASH_MULTI, FORWARDSLASH); taskDirectoryText.setText(dir); } }); } private void createSchedulingGroup(Composite container) { Group group = new Group(container, SWT.SHADOW_ETCHED_IN); group.setText(Messages.TasksUiPreferencePage_Scheduling); group.setLayout(new GridLayout(2, false)); group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Label weekStartLabel = new Label(group, SWT.NONE); weekStartLabel.setText(Messages.TasksUiPreferencePage_Week_Start); weekStartCombo = new Combo(group, SWT.READ_ONLY); weekStartCombo.add(CommonMessages.Sunday); weekStartCombo.add(CommonMessages.Monday); weekStartCombo.add(CommonMessages.Tuesday); weekStartCombo.add(CommonMessages.Wednesday); weekStartCombo.add(CommonMessages.Thursday); weekStartCombo.add(CommonMessages.Friday); weekStartCombo.add(CommonMessages.Saturday); weekStartCombo.select(getPreferenceStore().getInt(ITasksUiPreferenceConstants.WEEK_START_DAY) - 1); Label scheduleNewTasksLabel = new Label(group, SWT.NONE); scheduleNewTasksLabel.setText(Messages.TasksUiPreferencePage_ScheduleNewTasks); scheduleNewTasksCombo = new Combo(group, SWT.READ_ONLY); scheduleNewTasksCombo.add(Messages.TasksUiPreferencePage_ThisWeek); scheduleNewTasksCombo.add(Messages.TasksUiPreferencePage_Tomorrow); scheduleNewTasksCombo.add(Messages.TasksUiPreferencePage_Today); scheduleNewTasksCombo.add(Messages.TasksUiPreferencePage_Unscheduled); String scheduleFor = getPreferenceStore().getString(ITasksUiPreferenceConstants.SCHEDULE_NEW_TASKS_FOR); scheduleNewTasksCombo.select(SCHEDULE_TIME_MAP.getOrDefault(scheduleFor, 0)); } private void createTaskNavigationGroup(Composite parent) { Group group = new Group(parent, SWT.NONE); group.setText(Messages.TasksUiPreferencePage_Task_Navigation_Group_Label); group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); group.setLayout(new GridLayout()); showTaskTrimButton = new Button(group, SWT.CHECK); showTaskTrimButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false)); showTaskTrimButton.setText(Messages.TasksUiPreferencePage_Show_active_task_trim_Button_Label); showTaskTrimButton.setSelection(getPreferenceStore().getBoolean(ITasksUiPreferenceConstants.SHOW_TRIM)); } private void createTaskListGroup(Composite container) { Group group = new Group(container, SWT.SHADOW_ETCHED_IN); group.setText(Messages.TasksUiPreferencePage_Task_List_Group); group.setLayout(new GridLayout(1, false)); group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); taskListTooltipEnabledButton = new Button(group, SWT.CHECK); taskListTooltipEnabledButton.setText(Messages.TasksUiPreferencePage_Show_tooltip_on_hover_Label); taskListTooltipEnabledButton .setSelection(getPreferenceStore().getBoolean(ITasksUiPreferenceConstants.TASK_LIST_TOOL_TIPS_ENABLED)); taskListServiceMessageEnabledButton = new Button(group, SWT.CHECK); taskListServiceMessageEnabledButton .setText(Messages.TasksUiPreferencePage_Notification_for_new_connectors_available_Label); taskListServiceMessageEnabledButton .setSelection(getPreferenceStore().getBoolean(ITasksUiPreferenceConstants.SERVICE_MESSAGES_ENABLED)); } private Group createTaskActivityGroup(Composite container) { Group group = new Group(container, SWT.SHADOW_ETCHED_IN); group.setText(Messages.TasksUiPreferencePage_Task_Timing); group.setLayout(new GridLayout(3, false)); group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); boolean activityTrackingEnabled = MonitorUiPlugin.getDefault() .getPreferenceStore() .getBoolean(MonitorUiPlugin.ACTIVITY_TRACKING_ENABLED); boolean timeoutEnabled = MonitorUiPlugin.getDefault() .getPreferenceStore() .getBoolean(ActivityContextManager.ACTIVITY_TIMEOUT_ENABLED); activityTrackingEnabledButton = new Button(group, SWT.CHECK); activityTrackingEnabledButton.setText(Messages.TasksUiPreferencePage_Enable_Time_Tracking); activityTrackingEnabledButton.setSelection(activityTrackingEnabled); activityTrackingEnabledButton.setToolTipText(Messages.TasksUiPreferencePage_Track_Time_Spent); activityTrackingEnabledButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { updateRefreshGroupEnablements(); } }); GridDataFactory.swtDefaults().span(3, 1).applyTo(activityTrackingEnabledButton); timeoutEnabledButton = new Button(group, SWT.CHECK); timeoutEnabledButton.setText(Messages.TasksUiPreferencePage_Enable_inactivity_timeouts); timeoutEnabledButton.setSelection(timeoutEnabled); timeoutEnabledButton.setToolTipText(Messages.TasksUiPreferencePage_If_disabled); timeoutEnabledButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { updateRefreshGroupEnablements(); } }); GridDataFactory.swtDefaults().span(3, 1).applyTo(timeoutEnabledButton); timeoutLabel1 = new Label(group, SWT.NONE); timeoutLabel1.setText(Messages.TasksUiPreferencePage_Stop_time_accumulation_after); timeoutMinutes = new Spinner(group, SWT.BORDER); timeoutMinutes.setDigits(0); timeoutMinutes.setIncrement(5); timeoutMinutes.setMaximum(60); timeoutMinutes.setMinimum(1); long minutes = MonitorUiPlugin.getDefault() .getPreferenceStore() .getLong(ActivityContextManager.ACTIVITY_TIMEOUT) / MS_MINUTES; timeoutMinutes.setSelection((int) minutes); timeoutMinutes.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { updateRefreshGroupEnablements(); } }); timeoutLabel2 = new Label(group, SWT.NONE); timeoutLabel2.setText(Messages.TasksUiPreferencePage_minutes_of_inactivity); return group; } public void updateRefreshGroupEnablements() { String errorMessage = null; boolean synchronizeTaskList = enableFullTaskListSynch.getSelection(); if (synchronizeTaskList) { errorMessage = validateSynchronizeSchedule(fullSyncScheduleTime); if (errorMessage == null) { errorMessage = validateSynchronizeSchedule(relevantTasksSyncScheduleTime); } } setErrorMessage(errorMessage); setValid(errorMessage == null); if (activityTrackingEnabledButton.getSelection()) { timeoutEnabledButton.setEnabled(true); timeoutMinutes.setEnabled(timeoutEnabledButton.getSelection()); timeoutLabel1.setEnabled(timeoutEnabledButton.getSelection()); timeoutLabel2.setEnabled(timeoutEnabledButton.getSelection()); } else { timeoutEnabledButton.setEnabled(false); timeoutMinutes.setEnabled(false); timeoutLabel1.setEnabled(false); timeoutLabel2.setEnabled(false); } boolean synchronizeRelevantTasks = synchronizeTaskList && enableRelevantTasksSynch.getSelection(); enableRelevantTasksSynch.setEnabled(synchronizeTaskList); fullSyncScheduleTime.setEnabled(synchronizeTaskList); relevantTasksSyncScheduleTime.setEnabled(synchronizeRelevantTasks); } private String validateSynchronizeSchedule(Text synchronizeText) { String errorMessage = null; try { long number = Long.parseLong(synchronizeText.getText()); if (number <= 0) { errorMessage = Messages.TasksUiPreferencePage_Synchronize_schedule_time_must_be_GT_0; } } catch (NumberFormatException e) { errorMessage = Messages.TasksUiPreferencePage_Synchronize_schedule_time_must_be_valid_integer; } return errorMessage; } private String toMinutesString(long miliseconds) { long minutes = miliseconds / 60000; return Long.toString(minutes); } private boolean checkForExistingTasklist(String dir) { File newDataFolder = new File(dir); if (!newDataFolder.exists() && !newDataFolder.mkdirs()) { MessageDialog.openWarning(getControl().getShell(), Messages.TasksUiPreferencePage_Change_data_directory, Messages.TasksUiPreferencePage_Destination_folder_cannot_be_created); return false; } MessageDialog dialogConfirm = new MessageDialog(null, Messages.TasksUiPreferencePage_Confirm_Task_List_data_directory_change, null, Messages.TasksUiPreferencePage_A_new_empty_Task_List_will_be_created_in_the_chosen_directory_if_one_does_not_already_exists, MessageDialog.WARNING, new String[] { IDialogConstants.OK_LABEL, IDialogConstants.CANCEL_LABEL }, IDialogConstants.CANCEL_ID); int taskDataDirectoryAction = dialogConfirm.open(); if (taskDataDirectoryAction != IDialogConstants.OK_ID) { return false; } for (TaskEditor taskEditor : TasksUiInternal.getActiveRepositoryTaskEditors()) { TasksUiInternal.closeTaskEditorInAllPages(taskEditor.getTaskEditorInput().getTask(), true); } return true; } @Override public void dispose() { if (toolkit != null) { if (toolkit.getColors() != null) { toolkit.dispose(); } } super.dispose(); } }