/******************************************************************************* * Copyright (c) 2001, 2011 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 * David Schneider, david.schneider@unisys.com - [142500] WTP properties pages fonts don't follow Eclipse preferences *******************************************************************************/ package org.eclipse.wst.sse.ui.internal.preferences.ui; import java.util.ArrayList; import java.util.Arrays; import java.util.List; 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.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; 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.graphics.Point; 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.utils.StringUtils; import org.eclipse.wst.sse.ui.internal.SSEUIMessages; import com.ibm.icu.util.StringTokenizer; 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.BORDER); 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()); } }); Dialog.applyDialogFont(parent); 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; Label description = new Label(composite, SWT.NONE); description.setText(SSEUIMessages.TaskTagPreferenceTab_33); //$NON-NLS-1$ // description.setBackground(composite.getBackground()); GridData gd = new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1); // https://bugs.eclipse.org/bugs/show_bug.cgi?id=104403 Point sizeHint = description.computeSize(SWT.DEFAULT, SWT.DEFAULT); gd.widthHint = sizeHint.x; description.setLayoutData(gd); valueTable = new TableViewer(composite, SWT.BORDER | SWT.MULTI | 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) { ISelection selection = valueTable.getSelection(); editButton.setEnabled(((IStructuredSelection) selection).size() == 1); removeButton.setEnabled(!selection.isEmpty()); } }; 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(); removeTags(valueTable.getSelection()); 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$ } final IEclipsePreferences defaultPreferences = fPreferencesLookupOrder.length > 0 ? fPreferencesLookupOrder[fPreferencesLookupOrder.length - 1].getNode(TaskTagPreferenceKeys.TASK_TAG_NODE) : null; String tags = null; String priorities = null; if (defaultPreferences != null) { tags = defaultPreferences.get(TaskTagPreferenceKeys.TASK_TAG_TAGS, null); priorities = defaultPreferences.get(TaskTagPreferenceKeys.TASK_TAG_PRIORITIES, null); } loadTagsAndPrioritiesFrom(tags, priorities); int selection = valueTable.getTable().getSelectionIndex(); valueTable.setInput(fTaskTags); valueTable.getTable().setSelection(selection); } public void performOk() { performApply(); } /** * @param selection */ private void removeTags(ISelection selection) { IStructuredSelection structuredSelection = (IStructuredSelection) selection; List taskTags = new ArrayList(Arrays.asList(fTaskTags)); taskTags.removeAll(structuredSelection.toList()); 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); } } }