001: /*******************************************************************************
002: * Copyright (c) 2005, 2007 BEA Systems, Inc.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * wharley@bea.com - initial API and implementation
010: *******************************************************************************/package org.eclipse.jdt.apt.ui.internal.preferences;
011:
012: import java.util.ArrayList;
013: import java.util.List;
014:
015: import org.eclipse.jdt.apt.core.util.AptConfig;
016: import org.eclipse.jdt.apt.ui.internal.preferences.AptConfigurationBlock.ProcessorOption;
017: import org.eclipse.jdt.apt.ui.internal.util.IAptHelpContextIds;
018: import org.eclipse.jdt.internal.ui.dialogs.StatusInfo;
019: import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
020: import org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
021: import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
022: import org.eclipse.jdt.internal.ui.wizards.dialogfields.StringDialogField;
023: import org.eclipse.jface.dialogs.StatusDialog;
024: import org.eclipse.swt.SWT;
025: import org.eclipse.swt.layout.GridLayout;
026: import org.eclipse.swt.widgets.Composite;
027: import org.eclipse.swt.widgets.Control;
028: import org.eclipse.swt.widgets.Shell;
029: import org.eclipse.ui.PlatformUI;
030:
031: /**
032: * Dialog to edit or add an APT processor option
033: */
034: public class ProcessorOptionInputDialog extends StatusDialog {
035:
036: private class FieldAdapter implements IDialogFieldListener {
037: public void dialogFieldChanged(DialogField field) {
038: doValidation();
039: }
040: }
041:
042: private StringDialogField fKeyField;
043: private StringDialogField fValueField;
044:
045: private List<String> fExistingNames;
046:
047: public ProcessorOptionInputDialog(Shell parent,
048: ProcessorOption option,
049: List<ProcessorOption> existingEntries) {
050: super (parent);
051:
052: fExistingNames = new ArrayList<String>(existingEntries.size());
053: for (ProcessorOption o : existingEntries) {
054: if (!o.equals(option)) {
055: fExistingNames.add(o.key);
056: }
057: }
058:
059: if (option == null) {
060: setTitle(Messages.ProcessorOptionInputDialog_newProcessorOption);
061: } else {
062: setTitle(Messages.ProcessorOptionInputDialog_editProcessorOption);
063: }
064:
065: FieldAdapter adapter = new FieldAdapter();
066:
067: fKeyField = new StringDialogField();
068: fKeyField.setLabelText(Messages.ProcessorOptionInputDialog_key);
069: fKeyField.setDialogFieldListener(adapter);
070:
071: fValueField = new StringDialogField();
072: fValueField
073: .setLabelText(Messages.ProcessorOptionInputDialog_value);
074: fValueField.setDialogFieldListener(adapter);
075:
076: fKeyField.setText((option != null) ? option.key : ""); //$NON-NLS-1$
077: fValueField.setText((option != null) ? option.value : ""); //$NON-NLS-1$
078: }
079:
080: public ProcessorOption getResult() {
081: ProcessorOption option = new ProcessorOption();
082: option.key = fKeyField.getText().trim();
083: option.value = fValueField.getText().trim();
084:
085: return option;
086: }
087:
088: protected Control createDialogArea(Composite parent) {
089: Composite composite = (Composite) super
090: .createDialogArea(parent);
091:
092: Composite inner = new Composite(composite, SWT.NONE);
093: GridLayout layout = new GridLayout();
094: layout.marginHeight = 0;
095: layout.marginWidth = 0;
096: layout.numColumns = 2;
097: inner.setLayout(layout);
098:
099: fKeyField.doFillIntoGrid(inner, 2);
100: fValueField.doFillIntoGrid(inner, 2);
101:
102: LayoutUtil
103: .setHorizontalGrabbing(fKeyField.getTextControl(null));
104: LayoutUtil.setWidthHint(fKeyField.getTextControl(null),
105: convertWidthInCharsToPixels(50));
106: LayoutUtil.setHorizontalGrabbing(fValueField
107: .getTextControl(null));
108: LayoutUtil.setWidthHint(fValueField.getTextControl(null),
109: convertWidthInCharsToPixels(50));
110:
111: fKeyField.postSetFocusOnDialogField(parent.getDisplay());
112:
113: applyDialogFont(composite);
114: return composite;
115: }
116:
117: private void doValidation() {
118: StatusInfo status = new StatusInfo();
119: String newKey = fKeyField.getText();
120: String newVal = fValueField.getText();
121: // TODO: thorough validation of both key and value
122: if (newKey.length() == 0) {
123: status
124: .setError(Messages.ProcessorOptionInputDialog_emptyKey);
125: } else if (fExistingNames.contains(newKey)) {
126: status
127: .setError(Messages.ProcessorOptionInputDialog_keyAlreadyInUse);
128: } else if (newVal.indexOf('=') >= 0) {
129: status
130: .setError(Messages.ProcessorOptionInputDialog_equalsSignNotValid);
131: } else if (AptConfig.isAutomaticProcessorOption(newKey)) {
132: status
133: .setWarning(Messages.AptConfigurationBlock_warningIgnoredOptions);
134: }
135: updateStatus(status);
136: }
137:
138: /*
139: * @see org.eclipse.jface.window.Window#configureShell(Shell)
140: */
141: protected void configureShell(Shell newShell) {
142: super.configureShell(newShell);
143: PlatformUI.getWorkbench().getHelpSystem().setHelp(newShell,
144: IAptHelpContextIds.PROCESSOR_OPTION_INPUT_DIALOG);
145: }
146: }
|