/******************************************************************************* * Copyright (c) 2013 Google, Inc 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: * Sergey Prigogin (Google) - initial API and implementation *******************************************************************************/ package org.eclipse.cdt.internal.ui.preferences; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.layout.PixelConverter; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; import org.eclipse.cdt.internal.ui.ICHelpContextIds; import org.eclipse.cdt.internal.ui.dialogs.ResizableStatusDialog; import org.eclipse.cdt.internal.ui.dialogs.StatusInfo; import org.eclipse.cdt.internal.ui.wizards.dialogfields.DialogField; import org.eclipse.cdt.internal.ui.wizards.dialogfields.IDialogFieldListener; import org.eclipse.cdt.internal.ui.wizards.dialogfields.SelectionButtonDialogField; import org.eclipse.cdt.internal.ui.wizards.dialogfields.StringDialogField; public class HeaderSubstitutionEditDialog extends ResizableStatusDialog { private final StringDialogField fSourceField; private final StringDialogField fTargetField; private final SelectionButtonDialogField fRequiredSubstitutionCheckBox; public HeaderSubstitutionEditDialog(Shell shell, HeaderSubstitutionRule rule) { super(shell); if (rule == null || rule.getSource().isEmpty()) { setTitle(PreferencesMessages.HeaderSubstitutionEditDialog_new_title); } else { setTitle(PreferencesMessages.HeaderSubstitutionEditDialog_edit_title); } IDialogFieldListener listener = new IDialogFieldListener() { @Override public void dialogFieldChanged(DialogField field) { validate(); } }; fSourceField = new StringDialogField(); fSourceField.setLabelText(PreferencesMessages.HeaderSubstitutionEditDialog_source); fSourceField.setDialogFieldListener(listener); fTargetField = new StringDialogField(); fTargetField.setLabelText(PreferencesMessages.HeaderSubstitutionEditDialog_target); fTargetField.setDialogFieldListener(listener); fRequiredSubstitutionCheckBox = new SelectionButtonDialogField(SWT.CHECK); fRequiredSubstitutionCheckBox.setLabelText(PreferencesMessages.HeaderSubstitutionEditDialog_required_substitution); if (rule != null) { fSourceField.setText(rule.getSource()); fTargetField.setText(rule.getTarget()); fRequiredSubstitutionCheckBox.setSelection(rule.isUnconditionalSubstitution()); } validate(); } public HeaderSubstitutionRule getResult() { return new HeaderSubstitutionRule(fSourceField.getText().trim(), fTargetField.getText().trim(), fRequiredSubstitutionCheckBox.isSelected()); } @Override protected void configureShell(Shell newShell) { super.configureShell(newShell); PlatformUI.getWorkbench().getHelpSystem().setHelp(newShell, ICHelpContextIds.HEADER_SUBSTITUTION_EDIT_DIALOG); } @Override protected Control createDialogArea(Composite parent) { Composite composite = (Composite) super.createDialogArea(parent); PixelConverter conv = new PixelConverter(composite); Composite inner = new Composite(composite, SWT.NONE); GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true); int len = PreferencesMessages.HeaderSubstitutionEditDialog_enter_target.length() + 5; gridData.widthHint = conv.convertWidthInCharsToPixels(len); inner.setLayoutData(gridData); GridLayout layout = new GridLayout(2, false); layout.marginHeight = 0; layout.marginWidth = 0; inner.setLayout(layout); fSourceField.doFillIntoGrid(inner, 2); fTargetField.doFillIntoGrid(inner, 2); fRequiredSubstitutionCheckBox.doFillIntoGrid(composite, 2); applyDialogFont(composite); validate(); return composite; } private void validate() { IStatus status = StatusInfo.OK_STATUS; String source = fSourceField.getText().trim(); String target = fTargetField.getText().trim(); if (source.isEmpty()) { status = new StatusInfo(IStatus.INFO, PreferencesMessages.HeaderSubstitutionEditDialog_enter_source); } else if (!isValidHeader(source)) { status = new StatusInfo(IStatus.WARNING, PreferencesMessages.HeaderSubstitutionEditDialog_invalid_source); } else if (target.isEmpty()) { status = new StatusInfo(IStatus.INFO, PreferencesMessages.HeaderSubstitutionEditDialog_enter_target); } else if (!isValidHeader(target)) { status = new StatusInfo(IStatus.WARNING, PreferencesMessages.HeaderSubstitutionEditDialog_invalid_target); } else if (target.equals(source)) { status = new StatusInfo(IStatus.WARNING, PreferencesMessages.HeaderSubstitutionEditDialog_error_replacement_by_itself); } updateStatus(status); } @Override protected void updateButtonsEnableState(IStatus status) { // OK button is disabled unless the status is OK. super.updateButtonsEnableState(status.isOK() ? status : new StatusInfo(IStatus.ERROR, null)); } private boolean isValidHeader(String header) { if (header.isEmpty()) return false; if (header.startsWith("<") != header.endsWith(">")) //$NON-NLS-1$//$NON-NLS-2$ return false; if (header.startsWith("<") && header.length() < 3) //$NON-NLS-1$ return false; return true; } }