/*****************************************************************************
* Copyright (c) 2010 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 java.util.List;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.gef.palette.CombinedTemplateCreationEntry;
import org.eclipse.gef.palette.PaletteEntry;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.papyrus.customization.palette.dialog.LocalPaletteContentPage.EntryType;
import org.eclipse.papyrus.uml.diagram.common.Activator;
import org.eclipse.papyrus.uml.diagram.common.Messages;
import org.eclipse.papyrus.uml.diagram.common.part.PaletteUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
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.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.uml2.uml.Profile;
/**
* Class in charge of the composite in the {@link LocalPaletteContentPage}
*/
public class PaletteEntryProxyInformationComposite {
/** current selected entry proxy */
protected PaletteEntryProxy selectedEntryProxy;
/** proxy name text */
protected Text nameText;
/** proxy description text */
protected Text descriptionText;
/** proxy icon text */
protected Text iconText;
/** referenced proxy text */
protected Text referencedText;
/** list of applied profiles */
protected List<Profile> appliedProfiles;
protected Button iconButton;
/**
* Creates the content of the information composite
*
* @param parent
* the composite where to add created controls
* @param appliedProfiles
* the list of applied profiles
* @return the newly created composite
*/
public Composite createComposite(final Composite parent, List<Profile> appliedProfiles) {
this.appliedProfiles = appliedProfiles;
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(3, false);
composite.setLayout(layout);
GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
data.widthHint = 260;
data.horizontalIndent = 10;
composite.setLayoutData(data);
Label entryInformationLabel = new Label(composite, SWT.NONE);
entryInformationLabel.setText(Messages.Local_Palette_Entry_Information);
data = new GridData(SWT.FILL, SWT.FILL, true, false);
data.horizontalSpan = 3;
entryInformationLabel.setLayoutData(data);
Label nameLabel = new Label(composite, SWT.NONE);
nameLabel.setText(Messages.Local_Palette_Entry_Name);
data = new GridData(SWT.FILL, SWT.FILL, false, false);
nameLabel.setLayoutData(data);
nameText = new Text(composite, SWT.LEAD | SWT.BORDER);
data = new GridData(SWT.FILL, SWT.FILL, true, false);
nameText.setLayoutData(data);
nameText.addFocusListener(new NameFocusListener());
data = new GridData(SWT.FILL, SWT.FILL, true, false);
data.horizontalSpan = 2;
nameText.setLayoutData(data);
Label referencedLabel = new Label(composite, SWT.NONE);
referencedLabel.setText(Messages.Local_Palette_Entry_Reference);
data = new GridData(SWT.FILL, SWT.BEGINNING, true, false);
referencedLabel.setLayoutData(data);
referencedText = new Text(composite, SWT.LEAD | SWT.BORDER | SWT.READ_ONLY);
data = new GridData(SWT.FILL, SWT.FILL, true, false);
referencedText.setLayoutData(data);
data = new GridData(SWT.FILL, SWT.FILL, true, false);
data.horizontalSpan = 2;
referencedText.setLayoutData(data);
Label descriptionLabel = new Label(composite, SWT.NONE);
descriptionLabel.setText(Messages.Local_Palette_Entry_Description);
data = new GridData(SWT.FILL, SWT.BEGINNING, true, false);
descriptionLabel.setLayoutData(data);
descriptionText = new Text(composite, SWT.WRAP | SWT.BORDER);
data = new GridData(SWT.FILL, SWT.FILL, true, true);
data.horizontalSpan = 2;
data.widthHint = 160;
descriptionText.setLayoutData(data);
descriptionText.addFocusListener(new DescriptionFocusListener());
Label iconLabel = new Label(composite, SWT.NONE);
iconLabel.setText(Messages.Local_Palette_Entry_Icon);
data = new GridData(SWT.FILL, SWT.BEGINNING, true, false);
iconLabel.setLayoutData(data);
iconText = new Text(composite, SWT.LEAD | SWT.BORDER);
data = new GridData(SWT.FILL, SWT.FILL, true, false);
iconText.setLayoutData(data);
iconText.addFocusListener(new IconFocusListener());
iconButton = new Button(composite, SWT.NONE);
iconButton.setText("Select...");
iconButton.addMouseListener(new MouseListener() {
/**
* @{inheritDoc
*/
public void mouseUp(MouseEvent e) {
BundleIconExplorerDialog dialog = new BundleIconExplorerDialog(parent.getShell(), iconText.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 {
iconText.setText(values[0].toString());
selectedEntryProxy.getEntry().setSmallIcon(Activator.getImageDescriptor(iconText.getText().trim()));
selectedEntryProxy.getEntry().setLargeIcon(Activator.getImageDescriptor(iconText.getText().trim()));
if(selectedEntryProxy instanceof PaletteAspectToolEntryProxy) {
((PaletteAspectToolEntryProxy)selectedEntryProxy).setIcon(iconText.getText().trim());
}
}
}
}
/**
* @{inheritDoc
*/
public void mouseDown(MouseEvent e) {
}
/**
* @{inheritDoc
*/
public void mouseDoubleClick(MouseEvent e) {
}
});
return composite;
}
/**
* Updates the name field in the information area
*/
protected void updateNameEntryField() {
EntryType type = selectedEntryProxy.getType();
switch(type) {
case STACK:
case SEPARATOR:
nameText.setText("");
nameText.setEnabled(false);
break;
case DRAWER:
case TOOL:
case ASPECT_TOOL:
// the fields describing information about entry should be updated
String name = selectedEntryProxy.getLabel();
nameText.setText((name != null) ? name : "");
nameText.setEnabled(true);
break;
}
}
/**
* Updates the reference field in the information area
*/
protected void updateReferencedEntryField() {
if(selectedEntryProxy instanceof PaletteAspectToolEntryProxy) {
CombinedTemplateCreationEntry entry = ((PaletteAspectToolEntryProxy)selectedEntryProxy).getEntry().getReferencedEntry();
EClass eClass = PaletteUtil.getToolMetaclass(entry);
referencedText.setText((eClass != null) ? eClass.getInstanceTypeName() : "");
} else if(selectedEntryProxy instanceof PaletteEntryProxy) {
PaletteEntry entry = selectedEntryProxy.getEntry();
if(entry instanceof CombinedTemplateCreationEntry) {
EClass eClass = PaletteUtil.getToolMetaclass((CombinedTemplateCreationEntry)entry);
referencedText.setText((eClass != null) ? eClass.getInstanceTypeName() : "");
} else {
referencedText.setText("");
}
} else {
// should never happen
referencedText.setText("");
}
}
/**
* Updates the description field in the information area
*/
protected void updateDescriptionEntryField() {
EntryType type = selectedEntryProxy.getType();
switch(type) {
case STACK:
case SEPARATOR:
case DRAWER:
descriptionText.setText("");
descriptionText.setEnabled(false);
break;
case TOOL:
case ASPECT_TOOL:
// the fields describing information about entry should be updated
String name = selectedEntryProxy.getDescription();
descriptionText.setText((name != null) ? name : "");
descriptionText.setEnabled(true);
break;
}
}
/**
* Updates the icon field in the information area
*/
protected void updateIconEntryField() {
EntryType type = selectedEntryProxy.getType();
switch(type) {
case STACK:
case SEPARATOR:
case TOOL:
iconText.setText("");
iconText.setEnabled(false);
iconButton.setEnabled(false);
break;
case DRAWER:
String drawerIcon = selectedEntryProxy.getImagePath();
iconText.setText((drawerIcon != null) ? drawerIcon : "");
iconText.setEnabled(false);
iconButton.setEnabled(false);
break;
case ASPECT_TOOL:
String icon = selectedEntryProxy.getImagePath();
iconText.setText((icon != null) ? icon : "");
iconText.setEnabled(true);
iconButton.setEnabled(true);
break;
}
}
/**
* Sets the new Selected entry
*
* @param selectedEntryProxy
* the selectedEntryProxy to set
*/
public void setSelectedEntryProxy(PaletteEntryProxy selectedEntryProxy) {
this.selectedEntryProxy = selectedEntryProxy;
updateNameEntryField();
updateIconEntryField();
updateReferencedEntryField();
updateDescriptionEntryField();
}
/**
* focus listener for the name text field
*/
protected class NameFocusListener implements FocusListener {
/**
* @{inheritDoc
*/
public void focusGained(FocusEvent e) {
}
/**
* @{inheritDoc
*/
public void focusLost(FocusEvent e) {
if(selectedEntryProxy != null) {
selectedEntryProxy.setLabel(nameText.getText().trim());
}
}
}
/**
* focus listener for the name text field
*/
protected class DescriptionFocusListener implements FocusListener {
/**
* @{inheritDoc
*/
public void focusGained(FocusEvent e) {
}
/**
* @{inheritDoc
*/
public void focusLost(FocusEvent e) {
if(selectedEntryProxy != null && selectedEntryProxy.getEntry() != null) {
selectedEntryProxy.setDescription(descriptionText.getText().trim());
}
}
}
/**
* focus listener for the name text field
*/
protected class IconFocusListener implements FocusListener {
/**
* @{inheritDoc
*/
public void focusGained(FocusEvent e) {
}
/**
* @{inheritDoc
*/
public void focusLost(FocusEvent e) {
if(selectedEntryProxy != null && iconText.getText() != null && !iconText.getText().equals("")) {
selectedEntryProxy.getEntry().setSmallIcon(Activator.getImageDescriptor(iconText.getText().trim()));
selectedEntryProxy.getEntry().setLargeIcon(Activator.getImageDescriptor(iconText.getText().trim()));
if(selectedEntryProxy instanceof PaletteAspectToolEntryProxy) {
((PaletteAspectToolEntryProxy)selectedEntryProxy).setIcon(iconText.getText().trim());
}
}
}
}
}