package plots.views;
import java.util.ArrayList;
import java.util.regex.Pattern;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.widgets.Button;
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.swt.widgets.Text;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.dialogs.SelectionStatusDialog;
import org.eclipse.ui.texteditor.AbstractTextEditor;
import org.eclipse.ui.texteditor.IDocumentProvider;
public class ImportDataFromTextDialog extends SelectionStatusDialog {
private static final int BUTTON_ID = IDialogConstants.CLIENT_ID;
private Text regex;
private TableViewer viewer;
private DataImporter importer = new DataImporter();
private IWorkbenchWindow ww;
private ArrayList<String> textEditors;
private CCombo source;
public ImportDataFromTextDialog(Shell parent) {
super(parent);
setMessage("Choose content from on of the open editors listed below");
}
public void listOpenEditors(IWorkbenchWindow ww) {
this.ww = ww;
textEditors = new ArrayList<>();
IEditorReference[] editors = ww.getActivePage().getEditorReferences();
for (IEditorReference ep : editors) {
try {
textEditors.add(ep.getEditorInput().getName());
} catch (PartInitException e) {
}
}
}
private int getActiveSourceInWorkbench() {
IEditorPart ed = ww.getActivePage().getActiveEditor();
if (ed != null) {
String name = ed.getEditorInput().getName();
for (int i = 0; i < textEditors.size(); i++) {
if (name.equals(textEditors.get(i)))
return i;
}
}
return -1;
}
private String[] getSources() {
return textEditors.toArray(new String[textEditors.size()]);
}
private IDocument getSelectedEditorDocument(String name) {
AbstractTextEditor te = null;
if (ww == null)
return null;
IEditorReference[] editors = ww.getActivePage().getEditorReferences();
for (IEditorReference ep : editors) {
IEditorPart editor = ep.getEditor(false);
if (editor != null && editor.getEditorInput().getName().equals(name) && editor instanceof AbstractTextEditor) {
te = (AbstractTextEditor) editor;
}
}
if (te == null)
return null;
IDocumentProvider documentProvider = te.getDocumentProvider();
IDocument document = documentProvider.getDocument(te.getEditorInput());
return document;
}
@Override
protected Control createDialogArea(Composite parent) {
Composite area = (Composite) super.createDialogArea(parent);
// add combo to select the editor
source = new CCombo(area, SWT.BORDER | SWT.READ_ONLY);
GridDataFactory.fillDefaults().grab(true, false).applyTo(source);
String[] sources = getSources();
source.setItems(sources);
int selected = getActiveSourceInWorkbench();
if (selected < 0 && sources.length > 0)
selected = 0;
source.select(0);
// add regular expression field to be used to extract data
Label label = new Label(area, SWT.NONE);
label.setText("Regular expression to extract data");
GridDataFactory.fillDefaults().grab(true, false).applyTo(label);
regex = new Text(area, SWT.SINGLE | SWT.BORDER);
regex.setToolTipText("This expression is used to extract integer data from the text");
GridDataFactory.fillDefaults().grab(true, false).applyTo(regex);
viewer = new TableViewer(area, SWT.FULL_SELECTION | SWT.BORDER);
viewer.setContentProvider(new IStructuredContentProvider() {
private DataImporter input;
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
if (newInput instanceof DataImporter) {
input = (DataImporter) newInput;
}
}
@Override
public void dispose() {
}
@Override
public Object[] getElements(final Object inputElement) {
if (input == null)
return new String[0];
final String[] elements = new String[input.getData(0).length];
final int[] data = input.getData(0);
for (int i = 0; i < elements.length; i++) {
elements[i] = Integer.toString(data[i]);
}
return elements;
}
});
viewer.setInput(new String[] {"first", "second", "third", "fourth"});
GridDataFactory.fillDefaults().grab(true, true).applyTo(viewer.getControl());
regex.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
Button button = getButton(BUTTON_ID);
if (button == null || button.isDisposed())
return;
try {
Pattern.compile(regex.getText());
button.setEnabled(true);
} catch (Exception e1) {
button.setEnabled(false);
}
}
});
return area;
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
super.createButtonsForButtonBar(parent);
createButton(parent, BUTTON_ID, "Preview", false);
getButton(BUTTON_ID).setEnabled(false);
}
@Override
protected void buttonPressed(int buttonId) {
try {
if (buttonId == BUTTON_ID)
importData(100, true);
else if (buttonId == IDialogConstants.OK_ID)
importData(0, false);
} catch (BadLocationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
super.buttonPressed(buttonId);
}
private void importData(int lines, boolean show) throws BadLocationException {
String selected = source.getText();
IDocument document = getSelectedEditorDocument(selected);
if (document != null) {
String text;
if (lines > 0) {
int offset;
if (lines >= document.getNumberOfLines())
offset = document.getLength();
else
offset = document.getLineOffset(lines);
text = document.get(0, offset);
}
else
text = document.get(); // TODO: this is BAD: it returns the whole editor content!
importer.importFromText(text, regex.getText());
if (show)
viewer.setInput(importer);
}
}
@Override
protected void computeResult() {
// TODO Auto-generated method stub
}
public int[] getData() {
return importer.getData(0);
}
}