/*****************************************************************************
* Copyright (c) 2009 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:
* Remi Schnekenburger (CEA LIST) remi.schnekenburger@cea.fr - Initial API and implementation
*
*****************************************************************************/
package org.eclipse.papyrus.customization.palette.dialog;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.papyrus.uml.diagram.common.Activator;
import org.eclipse.papyrus.uml.diagram.common.Messages;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Widget;
/**
* Wizard page for information about the new drawer
*/
public class DrawerInformationPage extends WizardPage implements Listener {
/** text area for the name of the palette definition */
protected Text nameText;
/** text area for the id of the palette definition */
protected Text idText;
/** parent composite for advanced fields */
protected Composite advancedComposite;
/** Button to show/hide advanced fields */
protected Button advancedButton;
/** drawer ID */
protected String drawerID;
/** palette name */
protected String name;
/** image descriptor for the drawer icon */
protected String imageDescriptorPath;
/** Text area for icon path */
protected Text imageText;
/** drawer proxy to edit, if one exists */
protected final PaletteLocalDrawerProxy drawerProxy;
/** path to the icon */
protected static final String WIZARD_ICON = "/icons/new_drawer_wiz.gif";
/**
* Creates a new wizard page with the given name, title, and image.
*
* @param part
* the editor part in which the wizard was created
*/
public DrawerInformationPage() {
super(Messages.Wizard_Drawer_Page_Name, Messages.Wizard_Drawer_Page_Title, Activator.getImageDescriptor(WIZARD_ICON));
drawerProxy = null;
}
/**
* Creates a new wizard page with the given name, title, and image.
*
* @param part
* the editor part in which the wizard was created
*/
public DrawerInformationPage(PaletteLocalDrawerProxy drawerProxy) {
super(Messages.Wizard_Drawer_Page_Name, Messages.Wizard_Drawer_Page_Title, Activator.getImageDescriptor(WIZARD_ICON));
this.drawerProxy = drawerProxy;
}
/**
* {@inheritDoc}
*/
public void createControl(Composite parent) {
// initialize dialog units
initializeDialogUnits(parent);
// initialize values
intializeValues();
// Create a new composite as there is the title bar seperator
// to deal with
Composite control = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(2, false);
control.setLayout(layout);
control.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
setControl(control);
createNameControl(control);
createAdvancedControls(control);
// end of the control creation
Dialog.applyDialogFont(control);
validatePage();
// Show description on opening
setErrorMessage(null);
setMessage(null);
setPageComplete(false);
setControl(control);
}
/**
* initializes fields using context information
*/
protected void intializeValues() {
initName();
initDrawerID();
initImageDescriptor();
}
/**
* Returns the current value of palette name
*
* @return the current value of palette name
*/
public String getDrawerName() {
return name;
}
/**
* Returns the current value of palette ID
*
* @return the current value of palette ID
*/
public String getDrawerID() {
return drawerID;
}
/**
* Returns the current value of path for image descriptor
*
* @return the current value of path for image descriptor
*/
public String getImageDescriptorPath() {
return imageDescriptorPath;
}
/**
* inits the name field value
*/
protected void initName() {
if(drawerProxy == null) {
name = "";
} else {
name = drawerProxy.getLabel();
}
}
/**
* inits the palette id value
*/
protected void initDrawerID() {
if(drawerProxy == null) {
drawerID = "drawer_" + System.currentTimeMillis();
} else {
drawerID = drawerProxy.getId();
}
}
/**
* Inits the image descriptor
*/
protected void initImageDescriptor() {
if(drawerProxy == null) {
imageDescriptorPath = "/icons/drawer.gif";
} else {
imageDescriptorPath = drawerProxy.getImagePath();
}
}
/**
* Validates the content of the fields in this page
*/
protected boolean validatePage() {
boolean valid = true;
if(advancedComposite != null && !advancedComposite.isDisposed()) {
if("".equals(getDrawerID())) {
setErrorMessage(Messages.Wizard_Drawer_Error_Id);
valid = false;
} else if("".equals(getImageDescriptorPath())) {
setErrorMessage(Messages.Wizard_Drawer_Error_Icon);
valid = false;
}
}
if("".equals(getDrawerName())) {
setErrorMessage(Messages.Wizard_Drawer_Error_Name);
valid = false;
}
if(valid) {
setMessage(null);
setErrorMessage(null);
}
return valid;
}
/**
* Creates the widget for advanced options.
*
* @param parent
* the parent composite
*/
protected void createAdvancedControls(Composite parent) {
advancedButton = new Button(parent, SWT.PUSH);
advancedButton.setFont(parent.getFont());
advancedButton.setText(Messages.Dialog_Advanced_Button_Closed);
GridData data = setButtonLayoutData(advancedButton);
data.horizontalAlignment = GridData.BEGINNING;
data.horizontalSpan = 2;
advancedButton.setLayoutData(data);
advancedButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleAdvancedButtonSelect();
}
});
}
public Composite createAdvancedComposite(Composite parent) {
advancedComposite = new Composite(parent, SWT.NONE);
advancedComposite.setFont(parent.getFont());
advancedComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
GridLayout layout = new GridLayout(3, false);
layout.marginHeight = 0;
layout.marginWidth = 0;
advancedComposite.setLayout(layout);
createIconControl(advancedComposite);
createIDControl(advancedComposite);
advancedComposite.getParent().layout();
return advancedComposite;
}
/**
* creates the control area for the icon path definition
*
* @param composite
* the parent composite
*/
protected void createIconControl(final Composite composite) {
final Label iconLabel = new Label(composite, SWT.NONE);
iconLabel.setText(Messages.Wizard_Drawer_Icon);
iconLabel.setToolTipText(Messages.Wizard_Drawer_Icon_Tooltip);
imageText = new Text(composite, SWT.BORDER | SWT.READ_ONLY);
imageText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
imageText.setToolTipText(Messages.Wizard_Drawer_Icon_Tooltip);
// initialize, then add the listener...
initialPopulateDrawerIconField();
// imageText.addListener(SWT.Modify, this);
Button button = new Button(composite, SWT.NONE);
button.setText("...");
button.addMouseListener(new MouseListener() {
/**
* @{inheritDoc
*/
public void mouseUp(MouseEvent e) {
BundleIconExplorerDialog dialog = new BundleIconExplorerDialog(composite.getShell(), imageText.getText());
if(Dialog.OK == dialog.open()) {
Object[] values = dialog.getResult();
if(values.length != 1) {
Activator.log.error("Waiting one icon path, but found " + values.length, null);
} else {
imageDescriptorPath = values[0].toString();
imageText.setText(imageDescriptorPath);
}
}
setPageComplete(validatePage());
}
/**
* @{inheritDoc
*/
public void mouseDown(MouseEvent e) {
}
/**
* @{inheritDoc
*/
public void mouseDoubleClick(MouseEvent e) {
}
});
}
/**
* Shows/hides the advanced option widgets.
*/
protected void handleAdvancedButtonSelect() {
Composite composite = (Composite)getControl();
if(advancedComposite != null) {
advancedComposite.dispose();
advancedComposite = null;
advancedButton.setText(Messages.Dialog_Advanced_Button_Closed);
} else {
createAdvancedComposite(composite);
advancedButton.setText(Messages.Dialog_Advanced_Button_Opened);
}
}
/**
* creates the control area for the id definition
*
* @param control
* the parent composite
*/
protected void createIDControl(Composite control) {
final Label idLabel = new Label(control, SWT.NONE);
idLabel.setText(Messages.Wizard_Drawer_Id);
idLabel.setToolTipText(Messages.Wizard_Drawer_Id_Tooltip);
idText = new Text(control, SWT.BORDER);
GridData data = new GridData(SWT.FILL, SWT.CENTER, true, false);
data.horizontalSpan = 2;
idText.setLayoutData(data);
idText.setToolTipText(Messages.Wizard_Drawer_Id_Tooltip);
// initialize, then add the listener...
initialPopulateDrawerIDField();
idText.addListener(SWT.Modify, this);
}
/**
* intialize the field using current value of the palette id
*/
protected void initialPopulateDrawerIconField() {
imageText.setText(imageDescriptorPath);
}
/**
* intialize the field using current value of the palette id
*/
protected void initialPopulateDrawerIDField() {
idText.setText(drawerID);
}
/**
* creates the control area for the name definition
*
* @param control
* the parent composite
*/
protected void createNameControl(Composite control) {
final Label nameLabel = new Label(control, SWT.NONE);
nameLabel.setText(Messages.Wizard_Drawer_Name);
nameLabel.setToolTipText(Messages.Wizard_Drawer_Name_Tooltip);
nameText = new Text(control, SWT.BORDER);
nameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
nameText.setToolTipText(Messages.Wizard_Drawer_Name_Tooltip);
// initialize, then add the listener...
initialPopulateNameField();
nameText.addListener(SWT.Modify, this);
}
/**
* initialize name field
*/
protected void initialPopulateNameField() {
nameText.setText(name);
}
/**
* The <code>WizardNewFileCreationPage</code> implementation of this <code>Listener</code> method handles all events and enablements for controls
* on this page. Subclasses may extend.
*/
public void handleEvent(Event event) {
Widget widget = event.widget;
if(widget.equals(nameText)) {
name = nameText.getText();
} else if(widget.equals(idText)) {
drawerID = idText.getText();
}
setPageComplete(validatePage());
}
}