/*************************************************************************************
* Copyright (c) 2016 Red Hat, Inc. and others.
* 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:
* JBoss by Red Hat - Initial implementation.
************************************************************************************/
package org.eclipse.wst.json.ui.internal.preferences;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Set;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.resource.ImageDescriptor;
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.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.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.wst.json.core.internal.schema.catalog.UserEntries;
import org.eclipse.wst.json.core.internal.schema.catalog.UserEntry;
import org.eclipse.wst.json.ui.internal.JSONUIMessages;
import org.eclipse.wst.json.ui.internal.JSONUIPlugin;
public class EntryDialog extends TitleAreaDialog {
private Image dlgTitleImage;
private UserEntry selectedEntry;
private String fileMatch;
private URI url;
private Text fileMatchText;
private Text urlText;
private Button okButton;
private UserEntries entries;
protected EntryDialog(Shell parentShell, UserEntry entry, UserEntries entries) {
super(parentShell);
this.selectedEntry = entry;
this.entries = entries;
}
@Override
protected Control createContents(Composite parent) {
Control contents = super.createContents(parent);
if (selectedEntry == null) {
setTitle(JSONUIMessages.Add_Catalog_Entry);
setMessage(JSONUIMessages.Add_Catalog_Entry);
} else {
setTitle(JSONUIMessages.Edit_Catalog_Entry);
setMessage(JSONUIMessages.Edit_Catalog_Entry);
}
ImageDescriptor descriptor = JSONUIPlugin
.imageDescriptorFromPlugin(JSONUIPlugin.PLUGIN_ID,
"icons/WizBan.png"); //$NON-NLS-1$
if(descriptor != null) {
dlgTitleImage = descriptor.createImage();
setTitleImage(dlgTitleImage);
}
return contents;
}
@Override
public boolean close() {
if (dlgTitleImage != null) {
dlgTitleImage.dispose();
}
return super.close();
}
@Override
protected Control createDialogArea(Composite parent) {
Composite parentComposite = (Composite) super.createDialogArea(parent);
Composite container = new Composite(parentComposite, SWT.FILL);
GridLayout layout = new GridLayout(3,false);
layout.marginWidth = layout.marginHeight = 10;
container.setLayout(layout);
GridData gd = new GridData(GridData.FILL_BOTH);
container.setLayoutData(gd);
Label nameLabel = new Label(container, SWT.NONE);
nameLabel.setText(JSONUIMessages.FileMatch);
fileMatchText = new Text(container, SWT.SINGLE|SWT.BORDER);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan=2;
fileMatchText.setLayoutData(gd);
fileMatchText.addModifyListener(new ModifyListener(){
public void modifyText(ModifyEvent e) {
validatePage();
}
});
Label urlLabel = new Label(container, SWT.NONE);
urlLabel.setText(JSONUIMessages.URL);
urlText = new Text(container, SWT.SINGLE|SWT.BORDER);
gd = new GridData(GridData.FILL_HORIZONTAL);
urlText.setLayoutData(gd);
urlText.addModifyListener(new ModifyListener(){
public void modifyText(ModifyEvent e) {
validatePage();
}
});
if (selectedEntry != null) {
urlText.setText(selectedEntry.getUrl().toString());
fileMatchText.setText(selectedEntry.getFileMatch());
}
Button browse = new Button(container,SWT.PUSH);
browse.setText(JSONUIMessages.Browse);
browse.addSelectionListener(new SelectionListener(){
public void widgetSelected(SelectionEvent e) {
FileDialog dialog = new FileDialog(getShell(), SWT.SINGLE);
String result = dialog.open();
if (result == null || result.trim().length() == 0) {
return;
}
try {
String urlString = new File(result).toURI().toURL().toString();
urlText.setText(urlString);
} catch (MalformedURLException e1) {
urlText.setText("file:///" + result); //$NON-NLS-1$
}
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
return parentComposite;
}
private boolean validatePage() {
fileMatch = null;
url = null;
if (fileMatchText.getText().trim().length() <= 0) {
setErrorMessage(JSONUIMessages.The_name_field_is_required);
return updateButton(false);
}
Set<UserEntry> list = entries.getEntries();
for(UserEntry entry:list) {
if (entry != selectedEntry && fileMatchText.getText().equals(entry.getFileMatch())) {
setErrorMessage(JSONUIMessages.The_entry_already_exists);
return updateButton(false);
}
}
if (urlText.getText().trim().length() <= 0) {
setErrorMessage(JSONUIMessages.The_url_field_is_required);
return updateButton(false);
}
try {
@SuppressWarnings("unused")
URL url = new URL(urlText.getText());
} catch (MalformedURLException e) {
setErrorMessage(JSONUIMessages.Invalid_URL);
return updateButton(false);
}
setErrorMessage(null);
fileMatch = fileMatchText.getText();
try {
url = new URL(urlText.getText()).toURI();
} catch (MalformedURLException ignore) {
} catch (URISyntaxException ignore) {
}
return updateButton(true);
}
private boolean updateButton(boolean enabled) {
if (okButton != null) {
okButton.setEnabled(enabled);
}
return false;
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
okButton = createButton(parent, IDialogConstants.OK_ID,
IDialogConstants.OK_LABEL, true);
okButton.setEnabled(selectedEntry != null);
createButton(parent, IDialogConstants.CANCEL_ID,
IDialogConstants.CANCEL_LABEL, false);
}
public String getFileMatch() {
return fileMatch;
}
public URI getURL() {
return url;
}
}