Java tutorial
/******************************************************************************* * 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.text.NumberFormat; import java.text.ParseException; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.osee.framework.core.util.XResultData; import org.eclipse.osee.framework.jdk.core.util.Strings; import org.eclipse.osee.framework.ui.plugin.util.IShellCloseEvent; import org.eclipse.osee.framework.ui.skynet.results.XResultDataUI; import org.eclipse.osee.framework.ui.skynet.widgets.XText; import org.eclipse.osee.framework.ui.swt.Displays; import org.eclipse.osee.framework.ui.swt.FontManager; import org.eclipse.osee.framework.ui.swt.HyperLinkLabel; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.Clipboard; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; 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.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; /** * @author Donald G. Dunne */ public class EntryDialog extends MessageDialog { protected XText text; private Composite areaComposite; private String entryText = ""; private NumberFormat numberFormat; private String errorString = ""; private Button ok; private Label errorLabel; private boolean fillVertically = false; private Button fontButton; private String label; private Integer textHeight = null; private final List<IShellCloseEvent> closeEventListeners = new ArrayList<IShellCloseEvent>(); private final String dialogTitle; public EntryDialog(String dialogTitle, String dialogMessage) { this(Displays.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); this.dialogTitle = dialogTitle; } private final ModifyListener textModifyListener = new ModifyListener() { @Override public void modifyText(ModifyEvent e) { handleModified(); } }; private final MouseMoveListener compListener = new MouseMoveListener() { @Override public void mouseMove(MouseEvent e) { setInitialButtonState(); } }; protected Composite customAreaParent; @Override protected Control createCustomArea(Composite parent) { this.customAreaParent = parent; areaComposite = new Composite(parent, SWT.NONE); areaComposite.setLayout(new GridLayout(2, false)); GridData gd = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL); gd.widthHint = 500; areaComposite.setLayoutData(gd); areaComposite.addMouseMoveListener(compListener); createErrorLabel(areaComposite); createTextBox(); createOpenInEditorHyperlink(parent); createExtendedArea(areaComposite); areaComposite.layout(); parent.layout(); return areaComposite; } protected void createOpenInEditorHyperlink(Composite parent) { if (isFillVertically()) { HyperLinkLabel edit = new HyperLinkLabel(parent, SWT.None); edit.setText("open in editor"); edit.addListener(SWT.MouseUp, new Listener() { @Override public void handleEvent(Event event) { XResultData resultData = new XResultData(); resultData.addRaw(entryText); XResultDataUI.report(resultData, dialogTitle); close(); } }); } } private void createErrorLabel(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayout(new GridLayout(3, false)); GridData gd1 = new GridData(GridData.FILL_HORIZONTAL); gd1.horizontalSpan = 2; composite.setLayoutData(gd1); if (fillVertically) { createClearFixedFontWidgets(composite); } errorLabel = new Label(composite, SWT.NONE); errorLabel.setSize(errorLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT)); errorLabel.setText(""); if (!fillVertically) { GridData gd = new GridData(); gd.horizontalSpan = 3; errorLabel.setLayoutData(gd); } } protected void createClearFixedFontWidgets(Composite headerComp) { // Create error label Button button = new Button(headerComp, SWT.PUSH); button.setText("Clear"); button.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { super.widgetSelected(e); text.setText(""); } }); Button copyButton = new Button(headerComp, SWT.PUSH); copyButton.setText("Copy"); copyButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { Clipboard clipboard = new Clipboard(Display.getCurrent()); TextTransfer textTransfer = TextTransfer.getInstance(); clipboard.setContents(new Object[] { text.get() }, new Transfer[] { textTransfer }); } }); fontButton = new Button(headerComp, SWT.CHECK); fontButton.setText("Fixed Font"); fontButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { super.widgetSelected(e); if (fontButton.getSelection()) { text.setFont(getFont()); } else { text.setFont(null); } } }); } protected Font getFont() { return FontManager.getFont("Courier New", 8, SWT.NORMAL); } private void createTextBox() { text = new XText(Strings.isValid(label) ? label : ""); text.setFillHorizontally(true); text.setFocus(); if (!Strings.isValid(label)) { text.setDisplayLabel(false); } if (fillVertically) { text.setFillVertically(true); text.setHeight(textHeight == null ? 200 : textHeight); text.setFont(getFont()); } text.createWidgets(areaComposite, 2); text.setFocus(); if (Strings.isValid(entryText)) { text.set(entryText); text.selectAll(); } text.addModifyListener(textModifyListener); } @Override protected boolean isResizable() { return true; } protected void createExtendedArea(Composite parent) { // provided for subclass implementation } public void setInitialButtonState() { if (ok == null) { ok = getButton(0); handleModified(); } areaComposite.removeMouseMoveListener(compListener); } public void handleModified() { if (text != null) { entryText = text.get(); if (!isEntryValid()) { getButton(getDefaultButtonIndex()).setEnabled(false); errorLabel.setText(errorString); errorLabel.update(); areaComposite.layout(); } else { getButton(getDefaultButtonIndex()).setEnabled(true); errorLabel.setText(""); errorLabel.update(); areaComposite.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 (numberFormat == null) { return true; } try { numberFormat.parse(text.get()); } catch (ParseException ex) { return false; } return true; } public void setValidationErrorString(String errorString) { this.errorString = errorString; } public void setNumberFormat(NumberFormat numberFormat) { this.numberFormat = numberFormat; } /** * 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; } @Override protected void handleShellCloseEvent() { super.handleShellCloseEvent(); for (IShellCloseEvent event : closeEventListeners) { event.onClose(); } } public void addShellCloseEventListeners(IShellCloseEvent event) { closeEventListeners.add(event); } public void setLabel(String label) { this.label = label; } public void setTextHeight(Integer textHeight) { this.textHeight = textHeight; } /** * @return the errorString */ public String getErrorString() { return errorString; } /** * @param errorString the errorString to set */ public void setErrorString(String errorString) { this.errorString = errorString; } }