| /******************************************************************************* |
| * Copyright (c) 2004, 2007 Boeing. |
| * 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: |
| * Boeing - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.osee.framework.ui.skynet.widgets.dialog; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| import java.util.regex.Matcher; |
| import java.util.regex.Pattern; |
| import org.eclipse.jface.dialogs.MessageDialog; |
| import org.eclipse.osee.framework.ui.plugin.util.IShellCloseEvent; |
| import org.eclipse.osee.framework.ui.skynet.widgets.XText; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.ModifyEvent; |
| import org.eclipse.swt.events.ModifyListener; |
| import org.eclipse.swt.events.MouseEvent; |
| import org.eclipse.swt.events.MouseMoveListener; |
| import org.eclipse.swt.events.SelectionAdapter; |
| import org.eclipse.swt.events.SelectionEvent; |
| import org.eclipse.swt.events.SelectionListener; |
| import org.eclipse.swt.graphics.Font; |
| 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.Composite; |
| import org.eclipse.swt.widgets.Control; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.swt.widgets.Shell; |
| |
| public class EntryDialog extends MessageDialog { |
| |
| XText text; |
| Composite comp; |
| String entryText = ""; |
| String validationRegularExpression = null; |
| String validationErrorString = ""; |
| Button ok; |
| MouseMoveListener listener; |
| Label errorLabel; |
| boolean fillVertically = false; |
| private static Font font = null; |
| private Button fontButton; |
| |
| private final List<IShellCloseEvent> closeEventListeners = new ArrayList<IShellCloseEvent>(); |
| |
| public EntryDialog(String dialogTitle, String dialogMessage) { |
| super(Display.getCurrent().getActiveShell(), dialogTitle, null, dialogMessage, MessageDialog.QUESTION, |
| new String[] {"OK", "Cancel"}, 0); |
| } |
| |
| public EntryDialog(Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage, int dialogImageType, String[] dialogButtonLabels, int defaultIndex) { |
| super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels, |
| defaultIndex); |
| } |
| |
| @Override |
| protected Control createCustomArea(Composite parent) { |
| |
| comp = new Composite(parent, SWT.NONE); |
| comp.setLayout(new GridLayout(2, false)); |
| comp.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL)); |
| |
| listener = new MouseMoveListener() { |
| |
| public void mouseMove(MouseEvent e) { |
| setInitialButtonState(); |
| } |
| }; |
| comp.addMouseMoveListener(listener); |
| |
| Composite headerComp = new Composite(comp, SWT.NONE); |
| headerComp.setLayout(new GridLayout(3, false)); |
| GridData gd = new GridData(GridData.FILL_HORIZONTAL); |
| gd.horizontalSpan = 2; |
| headerComp.setLayoutData(gd); |
| |
| if (fillVertically) { |
| // Create error label |
| Button button = new Button(headerComp, SWT.PUSH); |
| button.setText("Clear"); |
| button.addSelectionListener(new SelectionAdapter() { |
| /* (non-Javadoc) |
| * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) |
| */ |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| super.widgetSelected(e); |
| text.setText(""); |
| } |
| }); |
| // Create error label |
| fontButton = new Button(headerComp, SWT.CHECK); |
| fontButton.setText("Fixed Font"); |
| fontButton.addSelectionListener(new SelectionAdapter() { |
| /* (non-Javadoc) |
| * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) |
| */ |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| super.widgetSelected(e); |
| if (fontButton.getSelection()) { |
| if (font == null) { |
| font = new Font(Display.getCurrent(), "Courier New", 8, SWT.NORMAL); |
| } |
| text.setFont(font); |
| } else |
| text.setFont(null); |
| } |
| }); |
| } |
| |
| // Create error label |
| errorLabel = new Label(headerComp, SWT.NONE); |
| errorLabel.setSize(errorLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT)); |
| errorLabel.setText(""); |
| if (!fillVertically) { |
| gd = new GridData(); |
| gd.horizontalSpan = 3; |
| errorLabel.setLayoutData(gd); |
| } |
| |
| text = new XText(); |
| text.setFillHorizontally(true); |
| text.setFocus(); |
| text.setDisplayLabel(false); |
| if (fillVertically) { |
| text.setFillVertically(true); |
| text.setHeight(200); |
| |
| text.setFont(font); |
| } |
| text.createWidgets(comp, 2); |
| text.setFocus(); |
| if (!entryText.equals("")) text.set(entryText); |
| |
| ModifyListener modifyListener = new ModifyListener() { |
| |
| public void modifyText(ModifyEvent e) { |
| handleModified(); |
| } |
| }; |
| text.addModifyListener(modifyListener); |
| createExtendedArea(comp); |
| comp.layout(); |
| parent.layout(); |
| return comp; |
| } |
| |
| @Override |
| protected boolean isResizable() { |
| return true; |
| } |
| |
| /** |
| * Override to provide other widgets |
| * |
| * @param parent |
| */ |
| protected void createExtendedArea(Composite parent) { |
| } |
| |
| public void setInitialButtonState() { |
| if (ok == null) { |
| ok = getButton(0); |
| handleModified(); |
| } |
| comp.removeMouseMoveListener(listener); |
| } |
| |
| public void handleModified() { |
| if (text != null) { |
| entryText = text.get(); |
| if (!isEntryValid()) { |
| getButton(getDefaultButtonIndex()).setEnabled(false); |
| errorLabel.setText(validationErrorString); |
| errorLabel.update(); |
| comp.layout(); |
| } else { |
| getButton(getDefaultButtonIndex()).setEnabled(true); |
| errorLabel.setText(""); |
| errorLabel.update(); |
| comp.layout(); |
| } |
| } |
| } |
| |
| public String getEntry() { |
| return entryText; |
| } |
| |
| public void setEntry(String entry) { |
| if (text != null) text.set(entry); |
| this.entryText = entry; |
| } |
| |
| /** |
| * override this method to make own checks on entry this will be called with every keystroke |
| * |
| * @return true if entry is valid |
| */ |
| public boolean isEntryValid() { |
| if (validationRegularExpression == null) { |
| return true; |
| } |
| // verify title is alpha-numeric with spaces and dashes |
| Matcher m = Pattern.compile(validationRegularExpression).matcher(text.get()); |
| return m.find(); |
| } |
| |
| public void setValidationRegularExpression(String regExp) { |
| validationRegularExpression = regExp; |
| } |
| |
| public void setValidationErrorString(String errorText) { |
| validationErrorString = errorText; |
| } |
| |
| /** |
| * Calling will enable dialog to loose focus |
| */ |
| public void setModeless() { |
| setShellStyle(SWT.DIALOG_TRIM | SWT.MODELESS); |
| setBlockOnOpen(false); |
| } |
| |
| public void setSelectionListener(SelectionListener listener) { |
| for (int i = 0; i < getButtonLabels().length; i++) { |
| Button button = getButton(i); |
| button.addSelectionListener(listener); |
| } |
| } |
| |
| public boolean isFillVertically() { |
| return fillVertically; |
| } |
| |
| public void setFillVertically(boolean fillVertically) { |
| this.fillVertically = fillVertically; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.dialogs.MessageDialog#handleShellCloseEvent() |
| */ |
| @Override |
| protected void handleShellCloseEvent() { |
| super.handleShellCloseEvent(); |
| for (IShellCloseEvent event : closeEventListeners) { |
| event.onClose(); |
| } |
| } |
| |
| public void addShellCloseEventListeners(IShellCloseEvent event) { |
| closeEventListeners.add(event); |
| } |
| |
| } |