/***************************************************************************** * Copyright (c) 2008 CEA LIST. * * * 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: * Chokri Mraidha (CEA LIST) Chokri.Mraidha@cea.fr - Initial API and implementation * Patrick Tessier (CEA LIST) Patrick.Tessier@cea.fr - modification * *****************************************************************************/ package org.eclipse.papyrus.uml.profile.ui.dialogs; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.TimeZone; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.papyrus.uml.profile.Activator; import org.eclipse.papyrus.uml.profile.ImageManager; import org.eclipse.papyrus.uml.profile.definition.PapyrusDefinitionAnnotation; import org.eclipse.papyrus.uml.profile.definition.Version; import org.eclipse.papyrus.uml.profile.preference.ProfileDefinitionPreferenceConstants; import org.eclipse.papyrus.uml.profile.utils.Util; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; 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.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.uml2.uml.Profile; public class ProfileDefinitionDialog extends TitleAreaDialog { /** path to the banner image */ public final static String PROFILE_DEFINITION = ImageManager.IMAGE_PATH + "wizban/NewDefinition.gif"; /** Text area that displays previous version of the profile definition */ protected Text oldVersionText; /** button to select the new version number (dev) */ protected Button devVersionButton; /** button to select the new version number (release) */ protected Button releaseVersionButton; /** button to select the new version number (major release) */ protected Button majorReleaseVersionButton; /** button to select the new version number (custom version) */ protected Button customVersionButton; /** Text area where custom version number can be entered */ protected Text customVersionText; /** Profile which is redefined */ protected Profile profileToDefine; /** development version */ private Version devVersionValue; /** release version */ private Version releaseVersionValue; /** major release version */ private Version majorReleaseVersionValue; /** oldVersion Value */ private Version oldVersionValue; /** custom Version Value */ private Version customReleaseVersionValue; /** custom Version Value */ private Version newVersionValue; /** Definition information */ protected PapyrusDefinitionAnnotation papyrusDefinitionAnnotation; /** Comment text area */ private Text commentText; /** Copyright text area */ private Text copyrightText; /** Author text area */ private Text authorText; /** Date text Area */ private Text dateText; /** check button for preference store */ private Button savePreferencesButton; /** list of previous definition annotations */ List<PapyrusDefinitionAnnotation> oldVersionAnnotations = new ArrayList<PapyrusDefinitionAnnotation>(); /** Combo that displays the history of comments */ Combo commentHistory; /** list of comments history */ final List<String> availableComments = new ArrayList<String>(); /** * Creates a new ProfileDefinitionDialog * * @param parentShell * the parent shell for this dialog */ public ProfileDefinitionDialog(Shell parentShell, Profile profileToDefine) { super(parentShell); setShellStyle(getShellStyle() | SWT.RESIZE); this.profileToDefine = profileToDefine; computeHistoryAnnotations(); } /** * retrieve version annotation history */ private void computeHistoryAnnotations() { // get all annotations for the given profile oldVersionAnnotations = Util.getAllPapyrusDefinitionAnnotation(profileToDefine); } /** * {@inheritDoc} */ @Override protected void okPressed() { // save author and copyright in preference store if(savePreferencesButton.getSelection()) { Activator.getDefault().getPreferenceStore().setValue(ProfileDefinitionPreferenceConstants.PREF_AUTHOR_NAME, authorText.getText()); Activator.getDefault().getPreferenceStore().setValue(ProfileDefinitionPreferenceConstants.PREF_COPYRIGHT, copyrightText.getText()); } // creates the new Papyrus Definition Annotation papyrusDefinitionAnnotation = new PapyrusDefinitionAnnotation(newVersionValue, commentText.getText(), copyrightText.getText(), dateText.getText(), authorText.getText()); super.okPressed(); } /** * {@inheritDoc} */ @Override protected Control createDialogArea(Composite parent) { // top level composite Composite parentComposite = (Composite)super.createDialogArea(parent); setTitle("Information about new definition"); setTitleImage(ImageManager.getImage(PROFILE_DEFINITION)); // create a composite with standard margins and spacing Composite composite = new Composite(parentComposite, SWT.NONE); GridLayout layout = new GridLayout(2, true); layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN); layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN); layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING); layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING); composite.setLayout(layout); composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); composite.setFont(parentComposite.getFont()); // compute initial values computeVersionValues(); // fill composite with information about new definition: // 1. version // 2. author // 3. comment // 4. date // 5. copyright GridData gd; Composite versionArea = createVersionArea(composite); gd = new GridData(SWT.FILL, SWT.CENTER, true, false); versionArea.setLayoutData(gd); Composite infoArea = createInfoArea(composite); gd = new GridData(SWT.FILL, SWT.FILL, true, true); infoArea.setLayoutData(gd); Composite commentArea = createCommentArea(composite); gd = new GridData(SWT.FILL, SWT.CENTER, true, true, 2, 1); commentArea.setLayoutData(gd); Composite copyrightArea = createCopyrightArea(composite); gd = new GridData(SWT.FILL, SWT.CENTER, true, true, 2, 1); copyrightArea.setLayoutData(gd); Composite advancedArea = createAdvancedArea(composite); gd = new GridData(SWT.FILL, SWT.CENTER, true, true, 2, 1); advancedArea.setLayoutData(gd); applyDialogFont(parentComposite); return parentComposite; } /** * Creates and returns the content of the advanced area. * * @param composite * The parent composite to contain the advanced area */ private Composite createAdvancedArea(Composite composite) { Composite parent = new Composite(composite, SWT.CENTER); GridLayout layout = new GridLayout(); parent.setLayout(layout); // new copyright area savePreferencesButton = new Button(parent, SWT.CHECK); savePreferencesButton.setText("Store author and copyright values in preferences."); GridData gd = new GridData(SWT.BEGINNING, SWT.CENTER, false, true); savePreferencesButton.setLayoutData(gd); return parent; } /** * Creates and returns the content of the copyright area. * * @param composite * The parent composite to contain the copyright area */ private Composite createCopyrightArea(Composite composite) { Group group = new Group(composite, SWT.CENTER); group.setText("Copyright"); GridLayout layout = new GridLayout(); group.setLayout(layout); // new copyright area copyrightText = new Text(group, SWT.MULTI | SWT.BORDER | SWT.WRAP | SWT.V_SCROLL); // should look copyrightText.setText(Activator.getDefault().getPreferenceStore().getString(ProfileDefinitionPreferenceConstants.PREF_COPYRIGHT)); GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, true); gd.heightHint = 60; copyrightText.setLayoutData(gd); return group; } /** * Creates and returns the content of the information area. * * @param composite * The parent composite to contain the information area */ private Composite createInfoArea(Composite composite) { Group group = new Group(composite, SWT.CENTER); group.setText("Info"); GridLayout layout = new GridLayout(2, false); group.setLayout(layout); Label dateLabel = new Label(group, SWT.LEFT); dateLabel.setText("Date"); GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false); dateLabel.setLayoutData(gd); dateText = new Text(group, SWT.SINGLE | SWT.BORDER); final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); final TimeZone local = TimeZone.getDefault(); sdf.setTimeZone(local); // new Date() gets current date/elapsedTime final String dateString = sdf.format(new Date()); dateText.setText(dateString); gd = new GridData(SWT.FILL, SWT.CENTER, true, false); dateText.setLayoutData(gd); Label authorLabel = new Label(group, SWT.LEFT); authorLabel.setText("Author"); gd = new GridData(SWT.FILL, SWT.CENTER, true, false); authorLabel.setLayoutData(gd); authorText = new Text(group, SWT.SINGLE | SWT.BORDER); // should look in preferences... authorText.setText(Activator.getDefault().getPreferenceStore().getString(ProfileDefinitionPreferenceConstants.PREF_AUTHOR_NAME)); gd = new GridData(SWT.FILL, SWT.CENTER, true, false); authorText.setLayoutData(gd); return group; } /** * Creates and returns the content of the comment area. * * @param composite * The parent composite to contain the comment area */ private Composite createCommentArea(Composite composite) { Group group = new Group(composite, SWT.CENTER); group.setText("Comments"); GridLayout layout = new GridLayout(1, false); group.setLayout(layout); // new comment area commentText = new Text(group, SWT.MULTI | SWT.BORDER | SWT.WRAP | SWT.V_SCROLL); commentText.setText(""); GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, true); gd.heightHint = 60; commentText.setLayoutData(gd); commentHistory = new Combo(group, SWT.READ_ONLY | SWT.DROP_DOWN); Iterator<PapyrusDefinitionAnnotation> it = oldVersionAnnotations.listIterator(); while(it.hasNext()) { String comment = it.next().getComment(); if(comment != null && !"".equals(comment)) { availableComments.add(comment); } } for(String comment : availableComments) { // should be max 80 characters or something like that commentHistory.add(comment.substring(0, Math.min(comment.length(), 80))); } commentHistory.addSelectionListener(new SelectionListener() { /** @{inheritedDoc */ public void widgetDefaultSelected(SelectionEvent e) { } /** @{inheritedDoc */ public void widgetSelected(SelectionEvent e) { int index = commentHistory.getSelectionIndex(); if(index == -1) { return; } String text = availableComments.get(index); commentText.setText(text); } }); gd = new GridData(SWT.FILL, SWT.CENTER, true, true); commentHistory.setLayoutData(gd); return group; } /** * Creates and returns the content of the version area. * * @param composite * The parent composite to contain the version area */ private Composite createVersionArea(Composite composite) { Group group = new Group(composite, SWT.CENTER); group.setText("Version"); GridLayout layout = new GridLayout(2, false); group.setLayout(layout); // old version label Label oldVersionLabel = new Label(group, SWT.LEFT); oldVersionLabel.setText("Previous Version"); GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false); oldVersionLabel.setLayoutData(gd); final Text oldVersionText = new Text(group, SWT.SINGLE | SWT.READ_ONLY | SWT.BORDER); oldVersionText.setText(oldVersionValue.toString()); gd = new GridData(SWT.FILL, SWT.CENTER, true, false); oldVersionText.setLayoutData(gd); // new version: // 1. Development version // 2. Release // 3. Major release // 4. Custom devVersionButton = new Button(group, SWT.CHECK); devVersionButton.setText("Development Version"); gd = new GridData(SWT.FILL, SWT.CENTER, true, false); devVersionButton.setLayoutData(gd); devVersionButton.setSelection(true); devVersionButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { developmentVersionButtonPressed(); } public void widgetDefaultSelected(SelectionEvent e) { } }); final Text devVersionText = new Text(group, SWT.SINGLE | SWT.READ_ONLY | SWT.BORDER); devVersionText.setText(devVersionValue.toString()); gd = new GridData(SWT.FILL, SWT.CENTER, true, false); devVersionText.setLayoutData(gd); // RELEASE AREA releaseVersionButton = new Button(group, SWT.CHECK); releaseVersionButton.setText("Release Version"); gd = new GridData(SWT.FILL, SWT.CENTER, true, false); releaseVersionButton.setLayoutData(gd); releaseVersionButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { releaseVersionButtonPressed(); } public void widgetDefaultSelected(SelectionEvent e) { } }); final Text releaseVersionText = new Text(group, SWT.SINGLE | SWT.READ_ONLY | SWT.BORDER); releaseVersionText.setText(releaseVersionValue.toString()); gd = new GridData(SWT.FILL, SWT.CENTER, true, false); releaseVersionText.setLayoutData(gd); // MAJOR RELEASE AREA majorReleaseVersionButton = new Button(group, SWT.CHECK); majorReleaseVersionButton.setText("Major Release"); gd = new GridData(SWT.FILL, SWT.CENTER, true, false); majorReleaseVersionButton.setLayoutData(gd); majorReleaseVersionButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { majorReleaseVersionButtonPressed(); } public void widgetDefaultSelected(SelectionEvent e) { } }); final Text majorReleaseVersionText = new Text(group, SWT.SINGLE | SWT.READ_ONLY | SWT.BORDER); majorReleaseVersionText.setText(majorReleaseVersionValue.toString()); gd = new GridData(SWT.FILL, SWT.CENTER, true, false); majorReleaseVersionText.setLayoutData(gd); // CUSTOM VERSION AREA customVersionButton = new Button(group, SWT.CHECK); customVersionButton.setText("Custom"); gd = new GridData(SWT.FILL, SWT.CENTER, true, false); customVersionButton.setLayoutData(gd); customVersionButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { customVersionButtonPressed(); } public void widgetDefaultSelected(SelectionEvent e) { } }); customVersionText = new Text(group, SWT.SINGLE | SWT.BORDER); customVersionText.setEditable(false); // by default customVersionText.setText(customReleaseVersionValue.toString()); gd = new GridData(SWT.FILL, SWT.CENTER, true, false); customVersionText.setLayoutData(gd); customVersionText.addFocusListener(new FocusListener() { public void focusGained(FocusEvent e) { customVersionText.setText(customReleaseVersionValue.toString()); } public void focusLost(FocusEvent e) { try { customReleaseVersionValue = Version.parseVersion(customVersionText.getText()); newVersionValue = customReleaseVersionValue; setErrorMessage(null); } catch (IllegalArgumentException iae) { setErrorMessage("Custom version number format should be X.Y.Z, not " + customVersionText.getText()); customReleaseVersionValue = devVersionValue; // default value developmentVersionButtonPressed(); } } }); return group; } /** * compute the value of the versions */ private void computeVersionValues() { oldVersionValue = Util.getProfileDefinitionVersion(profileToDefine); devVersionValue = new Version(oldVersionValue.getMajor(), oldVersionValue.getMinor(), oldVersionValue.getMicro() + 1); releaseVersionValue = new Version(oldVersionValue.getMajor(), oldVersionValue.getMinor() + 1, 0); majorReleaseVersionValue = new Version(oldVersionValue.getMajor() + 1, 0, 0); customReleaseVersionValue = devVersionValue; newVersionValue = devVersionValue; } /** * Action called as the development version button is pressed * * @param e * the selection event that triggers this behavior */ private void developmentVersionButtonPressed() { devVersionButton.setSelection(true); releaseVersionButton.setSelection(false); majorReleaseVersionButton.setSelection(false); customVersionButton.setSelection(false); newVersionValue = devVersionValue; customVersionText.setEditable(false); } /** * Action called as the release version button is pressed * * @param e * the selection event that triggers this behavior */ private void releaseVersionButtonPressed() { devVersionButton.setSelection(false); releaseVersionButton.setSelection(true); majorReleaseVersionButton.setSelection(false); customVersionButton.setSelection(false); newVersionValue = releaseVersionValue; customVersionText.setEditable(false); } /** * Action called as the major release version button is pressed * * @param e * the selection event that triggers this behavior */ private void majorReleaseVersionButtonPressed() { devVersionButton.setSelection(false); releaseVersionButton.setSelection(false); majorReleaseVersionButton.setSelection(true); customVersionButton.setSelection(false); newVersionValue = majorReleaseVersionValue; customVersionText.setEditable(false); } /** * Action called as the release version button is pressed * * @param e * the selection event that triggers this behavior */ private void customVersionButtonPressed() { devVersionButton.setSelection(false); releaseVersionButton.setSelection(false); majorReleaseVersionButton.setSelection(false); customVersionButton.setSelection(true); newVersionValue = customReleaseVersionValue; customVersionText.setEditable(true); } /** * {@inheritDoc} */ @Override protected void configureShell(Shell shell) { super.configureShell(shell); setShellStyle(getShellStyle() | SWT.RESIZE); shell.setText("Profile Definition"); //$NON-NLS-1$ } /** * Returns the defined PapyrusDefinitionAnnotation * * @return the papyrusDefinitionAnnotation */ public PapyrusDefinitionAnnotation getPapyrusDefinitionAnnotation() { return papyrusDefinitionAnnotation; } }