package net.sourceforge.sqlexplorer.dialogs;
import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.SortedMap;
import net.sourceforge.sqlexplorer.IConstants;
import net.sourceforge.sqlexplorer.Messages;
import net.sourceforge.sqlexplorer.plugin.SQLExplorerPlugin;
import net.sourceforge.sqlexplorer.util.ImageUtil;
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.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FillLayout;
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.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
/**
* Abstract base dialog for obtaining data export options.
*
* @author Rocco Rutte <a href="mailto:pdmef@gmx.net"><pdmef@gmx.net></a>.
*
*/
public abstract class AbstractExportOptionsDlg extends TitleAreaDialog {
private static final ImageDescriptor _image = ImageUtil.getDescriptor("Images.ExportIconLarge");
private Combo uiCharset;
private Combo uiDelim;
private Text uiNullValue;
private Button uiIncHeaders;
private Button uiQuoteText;
private Button uiRtrim;
private Text uiFile;
private String charset;
private String delim;
private String nullValue;
private boolean incHeaders;
private boolean quoteText;
private boolean rtrim;
private String file;
private final Shell shell;
/**
* Flag indicating consumer wants to obtain character set.
*/
public static final int FMT_CHARSET = 1 << 0;
/**
* Flag indicating consumer wants to obtain field delimiter.
*/
public static final int FMT_DELIM = 1 << 1;
/**
* Flag indicating consumer wants to obtain null value string.
*/
public static final int FMT_NULL = 1 << 2;
/**
* Flag indicating consumer wants to know whether to export column headers.
*/
public static final int OPT_HDR = 1 << 3;
/**
* Flag indicating consumer wants to know whether to quote string values.
*/
public static final int OPT_QUOTE = 1 << 4;
/**
* Flag indicating consumer wants to know whether to right-trim values.
*/
public static final int OPT_RTRIM = 1 << 5;
private static final String[] DELIMS = { ";", "|", "\\t [TAB]", "," };
/**
* Create new base dialog.
*
* @param parentShell Parent's shell.
*/
public AbstractExportOptionsDlg(Shell parentShell) {
super(parentShell);
this.shell = parentShell;
}
/**
* Get dialog's title. It must be translated already.
*
* @return Translated title.
*/
public abstract String getTitle();
/**
* Get dialog's message. It must be translated already.
*
* @return Translated message.
*/
@Override
public abstract String getMessage();
/**
* Get dialog's file filter when choosing input file.
*
* @return List of file patterns (already containing '*').
*/
public abstract String[] getFileFilter();
/**
* Get dialog's flags. Read: what to ask for. Choosing a filename cannot be turned off.
*
* @return Flags.
*/
public abstract int getFlags();
@Override
protected Control createContents(Composite parent) {
Control contents = super.createContents(parent);
setTitle(getTitle());
setMessage(getMessage());
setTitleImage(_image.createImage());
return contents;
}
@Override
protected Control createDialogArea(Composite parent) {
Composite comp = new Composite(parent, SWT.NONE);
comp.setLayout(new FillLayout(SWT.VERTICAL));
comp.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
String columnSeparator = SQLExplorerPlugin.getDefault().getPreferenceStore().getString(IConstants.CLIP_EXPORT_SEPARATOR);
boolean hdr = SQLExplorerPlugin.getDefault().getPreferenceStore().getBoolean(IConstants.CLIP_EXPORT_COLUMNS);
Label l = null;
int flags = getFlags();
addContentChooseRadio(comp);
if ((flags & FMT_CHARSET) != 0 || (flags & FMT_DELIM) != 0 || (flags & FMT_NULL) != 0) {
Group fmtGroup = new Group(comp, SWT.SHADOW_ETCHED_IN);
fmtGroup.setText(Messages.getString("ExportDialog.group.format"));
fmtGroup.setLayout(new GridLayout(2, false));
int i = 0, def = 0;
if ((flags & FMT_CHARSET) != 0) {
l = new Label(fmtGroup, SWT.NONE);
l.setText(Messages.getString("ExportDialog.format.cs"));
uiCharset = new Combo(fmtGroup, SWT.READ_ONLY);
SortedMap m = Charset.availableCharsets();
for (Iterator it = m.keySet().iterator(); it.hasNext(); i++) {
Charset cs = (Charset) m.get(it.next());
uiCharset.add(cs.displayName());
if (cs.displayName().toLowerCase().equals("utf-8")) {
def = i;
}
}
uiCharset.select(def);
}
if ((flags & FMT_DELIM) != 0) {
l = new Label(fmtGroup, SWT.NONE);
l.setText(Messages.getString("ExportDialog.format.delim"));
uiDelim = new Combo(fmtGroup, SWT.NONE);
for (i = 0, def = 0; i < DELIMS.length; i++) {
uiDelim.add(DELIMS[i]);
if (DELIMS[i].toLowerCase().equals(columnSeparator)) {
def = i;
}
}
uiDelim.select(def);
}
if ((flags & FMT_NULL) != 0) {
l = new Label(fmtGroup, SWT.NONE);
l.setText(Messages.getString("ExportDialog.format.null"));
uiNullValue = new Text(fmtGroup, SWT.SINGLE | SWT.BORDER | SWT.FILL);
uiNullValue.setText("<null>");
uiNullValue.setLayoutData(new GridData(50, SWT.DEFAULT));
}
}
if ((flags & OPT_HDR) != 0 || (flags & OPT_QUOTE) != 0 || (flags & OPT_RTRIM) != 0) {
Group optionsGroup = new Group(comp, SWT.SHADOW_ETCHED_IN);
optionsGroup.setText(Messages.getString("ExportDialog.group.options"));
optionsGroup.setLayout(new GridLayout(1, true));
if ((flags & OPT_HDR) != 0) {
uiIncHeaders = new Button(optionsGroup, SWT.CHECK);
uiIncHeaders.setText(Messages.getString("ExportDialog.options.hdr"));
uiIncHeaders.setSelection(hdr);
}
if ((flags & OPT_QUOTE) != 0) {
uiQuoteText = new Button(optionsGroup, SWT.CHECK);
uiQuoteText.setText(Messages.getString("ExportDialog.options.quote"));
}
if ((flags & OPT_RTRIM) != 0) {
uiRtrim = new Button(optionsGroup, SWT.CHECK);
uiRtrim.setText(Messages.getString("ExportDialog.options.rtrim"));
}
}
Group fileGroup = new Group(comp, SWT.SHADOW_ETCHED_IN);
fileGroup.setText(Messages.getString("ExportDialog.group.file"));
fileGroup.setLayout(new GridLayout(2, false));
uiFile = new Text(fileGroup, SWT.BORDER | SWT.FILL | SWT.SINGLE);
uiFile.setLayoutData(new GridData(300, SWT.DEFAULT));
uiFile.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
sync();
}
public void keyReleased(KeyEvent e) {
sync();
}
});
Button choose = new Button(fileGroup, SWT.NONE);
choose.setText(Messages.getString("ExportDialog.file.choose"));
choose.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
chooseFilename();
}
});
comp.pack();
sync();
return comp;
}
/**
* DOC talend Comment method "addContentChooseRadio".
*
* @param comp
*/
protected abstract void addContentChooseRadio(Composite comp);
@Override
protected Control createButtonBar(Composite parent) {
Control c = super.createButtonBar(parent);
/*
* interupt dialog setup to force Ok button to disabled since filename field is empty.
*/
sync();
return c;
}
/**
* Toggle accessibility of Ok button depending on whether all input is given. This currently only depends on the
* filename being present.
*/
private void sync() {
String filename = uiFile.getText();
if (filename == null || filename.trim().length() == 0) {
setErrorMessage(Messages.getString("ExportDialog.error.file"));
} else {
setErrorMessage(null);
}
Button ok = getButton(IDialogConstants.OK_ID);
if (ok != null) {
ok.setEnabled(filename != null && filename.trim().length() != 0);
}
}
private void chooseFilename() {
FileDialog fileDialog = new FileDialog(shell, SWT.SAVE);
fileDialog.setFilterExtensions(getFileFilter());
final String fileName = fileDialog.open();
if (fileName != null && fileName.trim().length() != 0) {
uiFile.setText(fileName);
}
sync();
}
@Override
protected void okPressed() {
charset = uiCharset != null ? uiCharset.getText() : null;
delim = uiDelim != null ? uiDelim.getText() : null;
incHeaders = uiIncHeaders != null && uiIncHeaders.getSelection();
quoteText = uiQuoteText != null && uiQuoteText.getSelection();
rtrim = uiRtrim != null && uiRtrim.getSelection();
file = uiFile != null ? uiFile.getText() : null;
nullValue = uiNullValue != null ? uiNullValue.getText() : null;
super.okPressed();
}
/**
* Return chosen character set. The underlying list is obtained from Character set, i.e. it's valid.
*
* @return Character set or <tt>null</tt> if not requested.
*/
public String getCharacterSet() {
return charset;
}
/**
* Return chosen delimiter.
*
* @return Delimiter or <tt>null</tt> if not requested.
*/
public String getDelimiter() {
if (delim == null) {
return null;
}
if (delim.toLowerCase().startsWith("\\t")) {
return "\t";
}
return delim;
}
/**
* Return whether to include column headers.
*
* @return Whether to include column headers or <tt>false</tt> if not requested.
*/
public boolean includeHeaders() {
return incHeaders;
}
/**
* Return whether to quote text values.
*
* @return Whether to quote text values or <tt>false</tt> if not requested.
*/
public boolean quoteText() {
return quoteText;
}
/**
* Return whether to right-trim spaces.
*
* @return Whether to right-trim spaces or <tt>false</tt> if not requested.
*/
public boolean trimSpaces() {
return rtrim;
}
/**
* Return chosen filename.
*
* @return Filename
*/
public String getFilename() {
return file;
}
/**
* Return chosen null value replacement string.
*
* @return String or <tt>null</tt> if not requested.
*/
public String getNullValue() {
return nullValue;
}
}