blob: b389ab73b84c5fa24ba55eae198240d2cdc5163b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2005 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
*
*******************************************************************************/
package org.eclipse.wst.sse.ui.internal.preferences.ui;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.preferences.DefaultScope;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.IPreferencesService;
import org.eclipse.core.runtime.preferences.IScopeContext;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.window.Window;
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.graphics.Image;
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.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.wst.sse.core.internal.provisional.tasks.TaskTag;
import org.eclipse.wst.sse.core.internal.tasks.TaskTagPreferenceKeys;
import org.eclipse.wst.sse.core.internal.util.StringUtils;
import org.eclipse.wst.sse.ui.internal.SSEUIMessages;
class MainTab implements IPreferenceTab {
public class TaskTagDialog extends Dialog {
public TaskTag taskTag = null;
Combo priorityCombo = null;
Text tagText = null;
public TaskTagDialog(Shell parentShell) {
super(parentShell);
setShellStyle(getShellStyle() | SWT.RESIZE);
}
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText(SSEUIMessages.TaskTagPreferenceTab_5); //$NON-NLS-1$
}
protected Control createButtonBar(Composite parent) {
Control c = super.createButtonBar(parent);
getButton(IDialogConstants.OK_ID).setEnabled(taskTag == null || taskTag.getTag().length() > 0);
return c;
}
protected Control createDialogArea(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(new GridLayout(2, false));
GridData gridData = new GridData(GridData.FILL_BOTH);
gridData.widthHint = parent.getDisplay().getClientArea().width / 5;
composite.setLayoutData(gridData);
Label label = new Label(composite, SWT.NONE);
label.setText(SSEUIMessages.TaskTagPreferenceTab_6); //$NON-NLS-1$
label.setLayoutData(new GridData());
tagText = new Text(composite, SWT.NONE);
tagText.setText(taskTag != null ? taskTag.getTag() : ""); //$NON-NLS-1$
tagText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
tagText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
String testTag = tagText.getText();
String[] tags = new String[fTaskTags.length];
for (int i = 0; i < tags.length; i++) {
tags[i] = fTaskTags[i].getTag();
}
getButton(IDialogConstants.OK_ID).setEnabled(tagText.getText().length() > 0 && !Arrays.asList(tags).contains(testTag));
taskTag = new TaskTag(tagText.getText(), priorityCombo.getSelectionIndex());
}
});
label = new Label(composite, SWT.NONE);
label.setText(SSEUIMessages.TaskTagPreferenceTab_7); //$NON-NLS-1$
label.setLayoutData(new GridData());
priorityCombo = new Combo(composite, SWT.READ_ONLY | SWT.SINGLE);
priorityCombo.setItems(new String[]{SSEUIMessages.TaskTagPreferenceTab_0, SSEUIMessages.TaskTagPreferenceTab_1, SSEUIMessages.TaskTagPreferenceTab_2});
priorityCombo.select(taskTag != null ? taskTag.getPriority() : TaskTag.PRIORITY_NORMAL);
priorityCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
priorityCombo.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
taskTag = new TaskTag(taskTag.getTag(), priorityCombo.getSelectionIndex());
}
});
return composite;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
protected void okPressed() {
taskTag = new TaskTag(tagText.getText(), priorityCombo.getSelectionIndex());
super.okPressed();
}
}
public class TaskTagTableLabelProvider extends LabelProvider implements ITableLabelProvider {
public TaskTagTableLabelProvider() {
super();
}
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
public String getColumnText(Object element, int columnIndex) {
if (columnIndex < 1)
return ((TaskTag) element).getTag();
for (int i = 0; i < fTaskTags.length; i++) {
if (fTaskTags[i].equals(element)) {
if (fTaskTags[i].getPriority() == IMarker.PRIORITY_LOW) {
return SSEUIMessages.TaskTagPreferenceTab_0; //$NON-NLS-1$
}
else if (fTaskTags[i].getPriority() == IMarker.PRIORITY_HIGH) {
return SSEUIMessages.TaskTagPreferenceTab_2; //$NON-NLS-1$
}
else {
return SSEUIMessages.TaskTagPreferenceTab_1; //$NON-NLS-1$
}
}
}
return SSEUIMessages.TaskTagPreferenceTab_3; //$NON-NLS-1$
}
}
private static final boolean _debugPreferences = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.core/tasks/preferences")); //$NON-NLS-1$ //$NON-NLS-2$
private Control fControl;
private TaskTag[] fOriginalTaskTags;
private TaskTagPreferencePage fOwner = null;
private IScopeContext[] fPreferencesLookupOrder = null;
private IPreferencesService fPreferencesService = null;
private TaskTag[] fTaskTags;
private TableViewer valueTable = null;
public MainTab(TaskTagPreferencePage parent, IPreferencesService preferencesService, IScopeContext[] lookupOrder) {
super();
fOwner = parent;
fPreferencesLookupOrder = lookupOrder;
fPreferencesService = preferencesService;
}
private void addTag() {
TaskTagDialog dlg = new TaskTagDialog(fControl.getShell());
int result = dlg.open();
if (result == Window.OK) {
TaskTag newTag = dlg.taskTag;
List newTags = new ArrayList(Arrays.asList(fTaskTags));
newTags.add(newTag);
fTaskTags = (TaskTag[]) newTags.toArray(new TaskTag[newTags.size()]);
valueTable.setInput(fTaskTags);
valueTable.getTable().setSelection(fTaskTags.length - 1);
}
}
public Control createContents(Composite tabFolder) {
loadPreferenceValues();
fOriginalTaskTags = fTaskTags;
Composite composite = new Composite(tabFolder, SWT.NONE);
composite.setLayout(new GridLayout(2, false));
fControl = composite;
Text description = new Text(composite, SWT.READ_ONLY | SWT.WRAP);
description.setText(SSEUIMessages.TaskTagPreferenceTab_33); //$NON-NLS-1$
description.setBackground(composite.getBackground());
description.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL, GridData.VERTICAL_ALIGN_FILL, false, false, 2, 1));
valueTable = new TableViewer(composite, SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);
valueTable.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
TableColumn textColumn = new TableColumn(valueTable.getTable(), SWT.NONE, 0);
textColumn.setText(SSEUIMessages.TaskTagPreferenceTab_12); //$NON-NLS-1$
TableColumn priorityColumn = new TableColumn(valueTable.getTable(), SWT.NONE, 1);
priorityColumn.setText(SSEUIMessages.TaskTagPreferenceTab_13); //$NON-NLS-1$
valueTable.setContentProvider(new ArrayContentProvider());
valueTable.setLabelProvider(new TaskTagTableLabelProvider());
valueTable.getTable().setLinesVisible(true);
valueTable.getTable().setHeaderVisible(true);
TableLayout layout = new TableLayout();
layout.addColumnData(new ColumnWeightData(1, 140, true));
layout.addColumnData(new ColumnWeightData(1, 140, true));
valueTable.getTable().setLayout(layout);
Composite buttons = new Composite(composite, SWT.NONE);
buttons.setLayout(new GridLayout());
buttons.setLayoutData(new GridData(GridData.FILL_VERTICAL));
final Button addButton = new Button(buttons, SWT.PUSH);
addButton.setText(SSEUIMessages.TaskTagPreferenceTab_14); //$NON-NLS-1$
addButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
final Button editButton = new Button(buttons, SWT.PUSH);
editButton.setText(SSEUIMessages.TaskTagPreferenceTab_15); //$NON-NLS-1$
editButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
final Button removeButton = new Button(buttons, SWT.PUSH);
removeButton.setText(SSEUIMessages.TaskTagPreferenceTab_16); //$NON-NLS-1$
removeButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
editButton.setEnabled(false);
removeButton.setEnabled(false);
Label warning = new Label(composite, SWT.NONE);
warning.setLayoutData(new GridData());
warning.setText(SSEUIMessages.TaskTagPreferenceTab_19); //$NON-NLS-1$
final ISelectionChangedListener selectionChangedListener = new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
boolean enabledForSelection = !valueTable.getSelection().isEmpty();
editButton.setEnabled(enabledForSelection);
removeButton.setEnabled(enabledForSelection);
}
};
valueTable.addPostSelectionChangedListener(selectionChangedListener);
addButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
addTag();
valueTable.getTable().setSelection(fTaskTags.length - 1);
selectionChangedListener.selectionChanged(null);
}
});
editButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
int i = valueTable.getTable().getSelectionIndex();
editTag(i);
if (i >= 0) {
valueTable.getTable().setSelection(i);
selectionChangedListener.selectionChanged(null);
}
}
});
removeButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
int i = valueTable.getTable().getSelectionIndex();
removeTag(valueTable.getTable().getSelectionIndex());
if (i >= 0 && i < fTaskTags.length) {
valueTable.getTable().setSelection(i);
}
}
});
valueTable.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
int i = valueTable.getTable().getSelectionIndex();
editTag(i);
if (i >= 0) {
valueTable.getTable().setSelection(i);
selectionChangedListener.selectionChanged(null);
}
}
});
valueTable.setInput(fTaskTags);
return composite;
}
/**
* @param selection
*/
private void editTag(int i) {
if (i < 0) {
return;
}
int selection = valueTable.getTable().getSelectionIndex();
TaskTagDialog dlg = new TaskTagDialog(fControl.getShell());
dlg.taskTag = fTaskTags[selection];
int result = dlg.open();
if (result == Window.OK) {
fTaskTags[selection] = dlg.taskTag;
valueTable.refresh();
}
}
public String getTitle() {
return SSEUIMessages.TaskTagPreferenceTab_20;
}
private void loadPreferenceValues() {
String tags = fPreferencesService.getString(TaskTagPreferenceKeys.TASK_TAG_NODE, TaskTagPreferenceKeys.TASK_TAG_TAGS, "", fPreferencesLookupOrder); //$NON-NLS-1$
String priorities = fPreferencesService.getString(TaskTagPreferenceKeys.TASK_TAG_NODE, TaskTagPreferenceKeys.TASK_TAG_PRIORITIES, "", fPreferencesLookupOrder); //$NON-NLS-1$
loadTagsAndPrioritiesFrom(tags, priorities);
}
/**
* @param tags
* @param priorities
*/
private void loadTagsAndPrioritiesFrom(String tagString, String priorityString) {
String[] tags = StringUtils.unpack(tagString);
StringTokenizer toker = null;
List list = new ArrayList();
toker = new StringTokenizer(priorityString, ","); //$NON-NLS-1$
while (toker.hasMoreTokens()) {
Integer number = null;
try {
number = Integer.valueOf(toker.nextToken());
}
catch (NumberFormatException e) {
number = new Integer(IMarker.PRIORITY_NORMAL);
}
list.add(number);
}
Integer[] priorities = (Integer[]) list.toArray(new Integer[0]);
fTaskTags = new TaskTag[Math.min(tags.length, priorities.length)];
for (int i = 0; i < fTaskTags.length; i++) {
fTaskTags[i] = new TaskTag(tags[i], priorities[i].intValue());
}
}
public void performApply() {
save();
if (!Arrays.equals(fOriginalTaskTags, fTaskTags)) {
fOwner.requestRedetection();
}
fOriginalTaskTags = fTaskTags;
}
public void performDefaults() {
if (_debugPreferences) {
System.out.println("Loading defaults in " + getClass().getName()); //$NON-NLS-1$
}
IEclipsePreferences[] preferences = new IEclipsePreferences[fPreferencesLookupOrder.length];
for (int i = 0; i < preferences.length; i++) {
preferences[i] = fPreferencesLookupOrder[i].getNode(TaskTagPreferenceKeys.TASK_TAG_NODE);
}
String tags = fPreferencesService.get(TaskTagPreferenceKeys.TASK_TAG_TAGS, null, preferences);
String priorities = fPreferencesService.get(TaskTagPreferenceKeys.TASK_TAG_PRIORITIES, null, preferences);
loadTagsAndPrioritiesFrom(tags, priorities);
int selection = valueTable.getTable().getSelectionIndex();
valueTable.setInput(fTaskTags);
valueTable.getTable().setSelection(selection);
}
public void performOk() {
performApply();
}
/**
* @param selection
*/
private void removeTag(int i) {
if (i < 0) {
return;
}
List taskTags = new ArrayList(Arrays.asList(fTaskTags));
taskTags.remove(i);
fTaskTags = (TaskTag[]) taskTags.toArray(new TaskTag[taskTags.size()]);
valueTable.setInput(fTaskTags);
}
private void save() {
IEclipsePreferences defaultPreferences = new DefaultScope().getNode(TaskTagPreferenceKeys.TASK_TAG_NODE);
String defaultTags = defaultPreferences.get(TaskTagPreferenceKeys.TASK_TAG_TAGS, null);
String defaultPriorities = defaultPreferences.get(TaskTagPreferenceKeys.TASK_TAG_PRIORITIES, null);
StringBuffer buf = new StringBuffer();
for (int i = 0; i < fTaskTags.length; i++) {
if (i > 0) {
buf.append(","); //$NON-NLS-1$
}
buf.append(fTaskTags[i].getTag());
}
String currentTags = buf.toString();
if (currentTags.equals(defaultTags) && !fPreferencesLookupOrder[0].getName().equals(DefaultScope.SCOPE)) {
if (_debugPreferences) {
System.out.println(getClass().getName() + " removing " + TaskTagPreferenceKeys.TASK_TAG_TAGS + " from scope " + fPreferencesLookupOrder[0].getName() + ":" + fPreferencesLookupOrder[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
}
fPreferencesLookupOrder[0].getNode(TaskTagPreferenceKeys.TASK_TAG_NODE).remove(TaskTagPreferenceKeys.TASK_TAG_TAGS);
}
else {
fOwner.requestRedetection();
if (_debugPreferences) {
System.out.println(getClass().getName() + " setting " + TaskTagPreferenceKeys.TASK_TAG_TAGS + " \"" + currentTags + "\" in scope " + fPreferencesLookupOrder[0].getName() + ":" + fPreferencesLookupOrder[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
}
fPreferencesLookupOrder[0].getNode(TaskTagPreferenceKeys.TASK_TAG_NODE).put(TaskTagPreferenceKeys.TASK_TAG_TAGS, currentTags);
}
StringBuffer buf2 = new StringBuffer();
for (int i = 0; i < fTaskTags.length; i++) {
if (i > 0) {
buf2.append(","); //$NON-NLS-1$
}
buf2.append(String.valueOf(fTaskTags[i].getPriority()));
}
String priorities = buf2.toString();
if (priorities.equals(defaultPriorities) && !fPreferencesLookupOrder[0].getName().equals(DefaultScope.SCOPE)) {
if (_debugPreferences) {
System.out.println(getClass().getName() + " removing " + TaskTagPreferenceKeys.TASK_TAG_PRIORITIES + " from scope " + fPreferencesLookupOrder[0].getName() + ":" + fPreferencesLookupOrder[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
}
fPreferencesLookupOrder[0].getNode(TaskTagPreferenceKeys.TASK_TAG_NODE).remove(TaskTagPreferenceKeys.TASK_TAG_PRIORITIES);
}
else {
fOwner.requestRedetection();
if (_debugPreferences) {
System.out.println(getClass().getName() + " setting " + TaskTagPreferenceKeys.TASK_TAG_PRIORITIES + " \"" + priorities + "\" in scope " + fPreferencesLookupOrder[0].getName() + ":" + fPreferencesLookupOrder[0].getLocation()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
}
fPreferencesLookupOrder[0].getNode(TaskTagPreferenceKeys.TASK_TAG_NODE).put(TaskTagPreferenceKeys.TASK_TAG_PRIORITIES, priorities);
}
}
}