// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.mdm.repository.ui.dialogs;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
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;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbenchPartSite;
import org.talend.mdm.repository.core.impl.view.IViewNodeConstDef;
import org.talend.mdm.repository.i18n.Messages;
import com.amalto.workbench.dialogs.XpathSelectDialog;
import com.amalto.workbench.image.EImage;
import com.amalto.workbench.image.ImageCache;
public class RenameViewDialog extends Dialog implements SelectionListener {
private final String seprator3 = "#";//$NON-NLS-1$
private final String blankText = "";//$NON-NLS-1$
private Text entityText;
private Text filterText;
protected String value;
protected IInputValidator validator;
private IWorkbenchPartSite site;
protected Button okBtn;
protected Text errorMessageText;
/**
* Create the dialog.
* @param parentShell
*/
public RenameViewDialog(Shell parentShell, String dialogTitle, String dialogMessage, String initialValue,
IInputValidator validator, IWorkbenchPartSite site) {
super(parentShell);
this.value = initialValue;
this.validator = validator;
this.site = site;
setShellStyle(getShellStyle() | SWT.WRAP);
}
@Override
protected void configureShell(Shell shell) {
super.configureShell(shell);
shell.setText(Messages.RenameViewDialog_Rename);
}
/**
* Create contents of the dialog.
* @param parent
*/
@Override
protected Control createDialogArea(Composite parent) {
Composite container = (Composite) super.createDialogArea(parent);
createMainPart(container);
createBottom(container);
return container;
}
protected void createMainPart(Composite container) {
GridLayout gridLayout = (GridLayout) container.getLayout();
gridLayout.numColumns = 3;
Label label2 = new Label(container, SWT.NONE);
label2.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
label2.setText(Messages.RenameViewDialog_Entity);
entityText = new Text(container, SWT.SINGLE | SWT.BORDER | SWT.WRAP);
GridData layoutData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
layoutData.widthHint = 330;
entityText.setLayoutData(layoutData);
Button openDLG = new Button(container, SWT.NONE);
openDLG.setImage(ImageCache.getCreatedImage(EImage.DOTS_BUTTON.getPath()));
openDLG.addSelectionListener(this);
openDLG.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
openDLG.setToolTipText(Messages.ViewInputDialog_SelectOneEntity);
Label lblFilterName = new Label(container, SWT.NONE);
lblFilterName.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lblFilterName.setText(Messages.ViewInputDialog_lblFilterName_text);
filterText = new Text(container, SWT.BORDER);
GridData layoutData2 = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
layoutData2.widthHint = 310;
filterText.setLayoutData(layoutData2);
filterText.setText(Messages.RenameViewDialog_DefaultFilter);
new Label(container, SWT.NONE);
final Label internalLabel = new Label(container, SWT.NONE | SWT.WRAP);
internalLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 3,1));
internalLabel.setText(Messages.RenameViewDialog_InternalName);
internalLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));
if(value != null) {
String[] split = value.split(seprator3);
entityText.setText(split[0]);
if(split.length == 1)
filterText.setText(blankText);
else
filterText.setText(split[1]);
internalLabel.setText(getInternalName());
}
filterText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateOkButtonState();
internalLabel.setText(getInternalName());
}
});
entityText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateOkButtonState();
internalLabel.setText(getInternalName());
}
});
}
private void createBottom(Composite container) {
errorMessageText = new Text(container, 72);
errorMessageText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 3,1));
errorMessageText.setBackground(Display.getCurrent().getSystemColor(22));
}
private String getInternalName() {
String filterPart = blankText;
String filterStr = filterText.getText().trim();
if(!filterStr.isEmpty())
filterPart = seprator3 + filterStr;
String entityName = entityText.getText().trim();
String internalName = Messages.bind(Messages.RenameViewDialog_InternalNameX, IViewNodeConstDef.PREFIX_VIEW_UPPER
+ entityName + filterPart);
return internalName;
}
/**
* Create contents of the button bar.
* @param parent
*/
@Override
protected void createButtonsForButtonBar(Composite parent) {
okBtn = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
okBtn.setEnabled(false);
createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
}
@Override
protected void okPressed() {
saveDatas();
super.okPressed();
}
protected void saveDatas() {
value = entityText.getText().trim();
String filterStr = filterText.getText().trim();
if(!filterStr.isEmpty())
{
value += seprator3 + filterStr;
}
}
private void updateOkButtonState() {
if(okBtn != null) {
boolean isValid = validInput();
okBtn.setEnabled(isValid);
}
}
protected boolean validInput() {
String entityName = entityText.getText().trim();
String filter = filterText.getText().trim();
if(value.equals(entityName + seprator3 + filter))
return false;
if (validator != null) {
String prefix = IViewNodeConstDef.PREFIX_VIEW_UPPER;
if (entityName.isEmpty()) {
errorMessageText.setText(Messages.Common_nameCanNotBeEmpty);
return false;
}
String suffix = seprator3 + filter;
if (filter.isEmpty())
suffix = blankText;
String validMsg = validator.isValid(prefix + entityName + suffix);
if (validMsg != null) {
errorMessageText.setText(validMsg);
return false;
}
errorMessageText.setText(blankText);
}
return true;
}
/**
* Return the initial size of the dialog.
*/
@Override
protected Point getInitialSize() {
return new Point(478, 230);
}
public String getValue() {
return value;
}
public void widgetSelected(SelectionEvent e) {
XpathSelectDialog dlg = new XpathSelectDialog(getShell(), null, Messages.ViewInputDialog_SelectOneEntity, site, false, null);
dlg.setBlockOnOpen(true);
dlg.open();
if (dlg.getReturnCode() == Window.OK) {
entityText.setText(dlg.getEntityName());
dlg.close();
}
}
public void widgetDefaultSelected(SelectionEvent e) {
}
}