package org.reldb.dbrowser.ui.content.rev;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.reldb.dbrowser.ui.DbTab;
import org.reldb.dbrowser.ui.content.cmd.RelLineStyler;
import org.reldb.dbrowser.ui.content.rel.ExporterDialog;
import org.reldb.dbrowser.ui.content.rel.RelPanel;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Label;
public class ViewQueryDialog extends Dialog {
private final static String copyToCommandPrompt = "Copy to Command-line";
private final static String saveToViewPrompt = "Export View script";
private final static String saveToOperatorPrompt = "Export Operator script";
private final static String exportToFilePrompt = "Export query results to file";
private Visualiser visualiser;
protected Shell shell;
/**
* Create the dialog.
* @param parent
* @param style
*/
public ViewQueryDialog(Visualiser visualiser) {
super(visualiser.getShell(), 0);
setText("View and Export Query");
this.visualiser = visualiser;
}
/**
* Open the dialog.
* @return the result
*/
public void open() {
createContents();
shell.open();
shell.layout();
Display display = getParent().getDisplay();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
private boolean allowOverwrite(String scriptName) {
if (scriptName.equals("scratchpad"))
return true;
return MessageDialog.openConfirm(shell, "Overwrite?", "A script named '" + scriptName + "' already exists. Overwrite it?");
}
private void copyToCmd(String source) {
DbTab dbTab = visualiser.getModel().getRev().getDbTab();
dbTab.setAndDisplayCmdContent(source);
}
private void doSave(String source, String scriptName) {
if (scriptName.equals("scratchpad")) {
copyToCmd(source);
} else {
visualiser.getModel().getRev().changeCatalog(RelPanel.CATEGORY_SCRIPT, scriptName);
visualiser.getDatabase().setScript(scriptName, source);
}
}
private void doSaveToView(String viewName, String scriptName) {
String source = "VAR " + viewName.replace(' ', '_') + " VIEW " + visualiser.getQuery() + ';';
doSave(source, scriptName);
}
private void doSaveToOperator(String operatorName, String scriptName) {
String source =
"OPERATOR " + operatorName.replace(' ', '_') + "() RETURNS SAME_TYPE_AS(" + visualiser.getQuery() + ");\n" +
"\tRETURN " + visualiser.getQuery() + ";\n" +
"END OPERATOR;";
doSave(source, scriptName);
}
/**
* Create contents of the dialog.
*/
private void createContents() {
shell = new Shell(getParent(), SWT.CLOSE | SWT.RESIZE | SWT.TITLE);
shell.setSize(600, 300);
shell.setText(getText());
shell.setLayout(new FormLayout());
StyledText styledText = new StyledText(shell, SWT.BORDER);
styledText.addLineStyleListener(new RelLineStyler(visualiser.getDatabase().getKeywords()));
styledText.setBottomMargin(5);
styledText.setTopMargin(5);
styledText.setRightMargin(5);
styledText.setLeftMargin(5);
styledText.setEditable(false);
styledText.setText(visualiser.getQuery());
FormData fd_styledText = new FormData();
fd_styledText.left = new FormAttachment(0);
fd_styledText.top = new FormAttachment(0);
fd_styledText.right = new FormAttachment(100, 0);
styledText.setLayoutData(fd_styledText);
Composite composite = new Composite(shell, SWT.NONE);
composite.setLayout(new GridLayout(3, false));
FormData fd_composite = new FormData();
fd_composite.bottom = new FormAttachment(100, 0);
fd_composite.right = new FormAttachment(100, 0);
fd_composite.left = new FormAttachment(0);
composite.setLayoutData(fd_composite);
fd_styledText.bottom = new FormAttachment(composite, 0);
Button btnSaveToView = new Button(composite, SWT.NONE);
btnSaveToView.setText(saveToViewPrompt);
btnSaveToView.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
SaveToDialog saveToView = new SaveToDialog(shell, saveToViewPrompt, visualiser.getID());
if (saveToView.open() == IDialogConstants.OK_ID) {
String scriptName = saveToView.getName();
if (!visualiser.getDatabase().scriptExists(scriptName) || allowOverwrite(scriptName)) {
doSaveToView(visualiser.getID(), scriptName);
close();
}
}
}
});
Button btnSaveToOperator = new Button(composite, SWT.NONE);
btnSaveToOperator.setText(saveToOperatorPrompt);
btnSaveToOperator.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
SaveToDialog saveToOperator = new SaveToDialog(shell, saveToOperatorPrompt, visualiser.getID());
if (saveToOperator.open() == IDialogConstants.OK_ID) {
String scriptName = saveToOperator.getName();
if (!visualiser.getDatabase().scriptExists(scriptName) || allowOverwrite(scriptName)) {
doSaveToOperator(visualiser.getID(), scriptName);
close();
}
}
}
});
new Label(composite, SWT.NONE);
Button btnExportToFile = new Button(composite, SWT.NONE);
btnExportToFile.setText(exportToFilePrompt);
btnExportToFile.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
ExporterDialog.runQueryToExport(shell,
visualiser.getDatabase(),
visualiser.getModel().getModelName() + "_" + visualiser.getTitle(),
visualiser.getQuery());
}
});
Button btnCopyToCommandPrompt = new Button(composite, SWT.NONE);
btnCopyToCommandPrompt.setText(copyToCommandPrompt);
btnCopyToCommandPrompt.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
copyToCmd(visualiser.getQuery());
close();
}
});
Button btnClose = new Button(composite, SWT.NONE);
btnClose.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false, 1, 1));
btnClose.setText("Close");
btnClose.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
close();
}
});
btnClose.setFocus();
}
public void close() {
shell.dispose();
}
}