// ============================================================================
//
// 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 com.amalto.workbench.dialogs;
import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Set;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.core.resources.IFile;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.jface.text.source.VerticalRuler;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
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.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
import org.eclipse.ui.editors.text.TextSourceViewerConfiguration;
import org.eclipse.ui.internal.browser.WebBrowserPreference;
import com.amalto.workbench.editors.TransformerMainPage;
import com.amalto.workbench.i18n.Messages;
import com.amalto.workbench.utils.FileProvider;
import com.amalto.workbench.webservices.WSExtractedContent;
public class ProcessResultsDialog extends Dialog {
private static Log log = LogFactory.getLog(ProcessResultsDialog.class);
private final static int BUTTON_CLOSE = 10;
private static final String DEFAULT_DISPLAY_TEXT = Messages.ProcessResultsDialog_DefaultDisplayText;
protected Combo variablesCombo;
protected SourceViewer variablesViewer;
protected String title;
protected TreeMap<String, WSExtractedContent> resultsMap = null;
/**
* @param parentShell
*/
public ProcessResultsDialog(Shell parentShell, String title, TreeMap<String, WSExtractedContent> map) {
super(parentShell);
this.title = title;
this.resultsMap = map;
setShellStyle(getShellStyle() | SWT.RESIZE | SWT.MAX);
}
@Override
protected Control createDialogArea(Composite parent) {
try {
parent.getShell().setText(title);
Composite composite = (Composite) super.createDialogArea(parent);
GridLayout layout = (GridLayout) composite.getLayout();
layout.numColumns = 2;
((GridData) composite.getLayoutData()).widthHint = 800;
Label variableLabel = new Label(composite, SWT.NONE);
variableLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true, 1, 1));
variableLabel.setText(Messages.ProcessResultsDialog_PipelineVariables);
variablesCombo = new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY);
variablesCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true, 1, 1));
/*
* variablesCombo.addKeyListener( new KeyListener() { public void keyPressed(KeyEvent e) {} public void
* keyReleased(KeyEvent e) { if ((e.stateMask==0) && (e.character == SWT.CR)) {
* ProcessResultsPage.this.variablesViewer.setDocument(new Document(getText(variablesCombo.getText()))); }
* }//keyReleased }//keyListener );
*/
variablesViewer = new SourceViewer(composite, new VerticalRuler(10), SWT.V_SCROLL | SWT.H_SCROLL);
variablesViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true, 2, 1));
variablesViewer.configure(new TextSourceViewerConfiguration());
((GridData) variablesViewer.getControl().getLayoutData()).minimumHeight = 500;
final Button seeInBrowser = new Button(composite, SWT.PUSH);
seeInBrowser.setText(Messages.ProcessResultsDialog_display);
seeInBrowser.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
String htmlContent = variablesViewer.getTextWidget().getText();
IFile file = FileProvider.createdTempFile(htmlContent, Messages.ProcessResultsDialog_temphtml, null);
File htmlFile = file.getLocation().toFile();
String SHARED_ID = "org.eclipse.ui.browser"; //$NON-NLS-1$
try {
IWorkbenchBrowserSupport support = PlatformUI.getWorkbench().getBrowserSupport();
if (WebBrowserPreference.getBrowserChoice() == WebBrowserPreference.INTERNAL) {
support.createBrowser(IWorkbenchBrowserSupport.AS_EDITOR, file.getLocation().toPortableString(),
null, null).openURL(htmlFile.toURL());
} else {
support.createBrowser(IWorkbenchBrowserSupport.AS_EXTERNAL, SHARED_ID, null, null).openURL(
htmlFile.toURL());
}
} catch (Exception e1) {
log.error(e1.getMessage(), e1);
}
}
});
variablesCombo.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
String output = variablesCombo.getText();
if (output.startsWith(TransformerMainPage.DEFAULT_DISPLAY)) {
output = DEFAULT_DISPLAY_TEXT;// TransformerMainPage.DEFAULT_VAR+output.substring(TransformerMainPage.DEFAULT_DISPLAY.length());
}
String text = variablesCombo.getText();
if (text.equals(DEFAULT_DISPLAY_TEXT)) {
text = TransformerMainPage.DEFAULT_DISPLAY;
}
variablesViewer.setDocument(new Document(getText(text)));
seeInBrowser.setEnabled("html".equals(text)); //$NON-NLS-1$
}
});
variablesCombo.setFocus();
refreshData();
return composite;
} catch (Exception e) {
log.error(e.getMessage(), e);
MessageDialog.openError(this.getShell(), Messages._Error,
Messages.bind(Messages.ProcessResultsDialog_ErrorMsg, e.getLocalizedMessage()));
return null;
}
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, BUTTON_CLOSE, Messages.ProcessResultsDialog_Close, false);
}
@Override
protected void buttonPressed(int buttonId) {
switch (buttonId) {
case BUTTON_CLOSE:
this.close();
}
}
private static Pattern p = Pattern.compile(".*charset\\s*=[\"|']?(.+)[\"|']([\\s|;].*)?");//$NON-NLS-1$
protected String getText(String output) {
WSExtractedContent ct = resultsMap.get(output);
if (ct == null) {
return "";//$NON-NLS-1$
}
String contentType = ct.getContentType();
byte[] bytes = ct.getWsByteArray().getBytes();
if (bytes == null) {
return "";//$NON-NLS-1$
}
// extract charset
String charset = "UTF8";//$NON-NLS-1$
Matcher m = p.matcher(contentType);
if (m.matches()) {
charset = m.group(1).trim().toUpperCase();
}
if ("UTF-8".equals(charset)) {
charset = "UTF8";//$NON-NLS-1$
}
// display
try {
return new String(bytes, charset);
} catch (Exception ex) {
StringWriter sw = new StringWriter();
ex.printStackTrace(new PrintWriter(sw));
return Messages.bind(Messages.ProcessResultsDialog_ErrorContent, contentType, sw.toString());
}
}
protected void refreshData() {
try {
Set<String> outputs = resultsMap.keySet();
for (Object element : outputs) {
String output = (String) element;
if (output.startsWith(TransformerMainPage.DEFAULT_VAR)) {
output = DEFAULT_DISPLAY_TEXT;// TransformerMainPage.DEFAULT_DISPLAY+output.substring(TransformerMainPage.DEFAULT_VAR.length());
}
variablesCombo.add(output);
}
variablesCombo.select(0);
String text = variablesCombo.getText();
if (text.equals(DEFAULT_DISPLAY_TEXT)) {
text = TransformerMainPage.DEFAULT_DISPLAY;
}
variablesViewer.setDocument(new Document(getText(text)));
} catch (Exception e) {
log.error(e.getMessage(), e);
MessageDialog.openError(this.getShell(), Messages.ProcessResultsDialog_ErrorTitle,
Messages.bind(Messages.ProcessResultsDialog_ErrorMsg1, e.getLocalizedMessage()));
}
}
}