package org.mongodb.meclipse.editors;
import static org.mongodb.meclipse.MeclipsePlugin.getCaption;
import java.util.Iterator;
import java.util.Map;
import net.miginfocom.swt.MigLayout;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.swt.SWT;
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.Event;
import org.eclipse.swt.widgets.ExpandBar;
import org.eclipse.swt.widgets.ExpandItem;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.MultiPageEditorPart;
import org.mongodb.meclipse.MeclipsePlugin;
import org.mongodb.meclipse.views.objects.Collection;
import org.mongodb.meclipse.views.objects.Collection.CollectionType;
import com.mongodb.DBObject;
import com.mongodb.util.JSON;
import com.mongodb.util.JSONParseException;
/**
* @author Flavio [FlaPer87] Percoco Premoli
*/
public class CollectionEditor extends MultiPageEditorPart
implements
IResourceChangeListener {
public static final String ID = "org.mongodb.meclipse.editors.CollectionEditor";
private Button search;
private Button more;
private Button all;
private Text query;
private Text skipV;
private Text limitV;
private Collection col;
private ExpandBar bar;
private static final int maxElements = 20;
private Iterator<DBObject> cursor;
private Listener runQuery = new Listener() {
@Override
public void handleEvent(Event arg0) {
int skip = 0;
int limit = 0;
try {
skip = Integer.valueOf(skipV.getText());
} catch (NumberFormatException e) {
// TODO just ignore it?
}
try {
limit = Integer.valueOf(limitV.getText());
} catch (NumberFormatException e) {
// TODO just ignore it?
}
for (ExpandItem item : bar.getItems()) {
item.dispose();
}
bar.setData(null);
bar.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
try {
cursor = col.getCollection()
.find((DBObject) JSON.parse(query.getText()))
.limit(limit).skip(skip).iterator();
loadEntries(false);
} catch (JSONParseException e) {
// TODO display Error message
System.out.println(e);
}
}
};
public CollectionEditor() {
}
@Override
public void doSave(IProgressMonitor monitor) {
}
@Override
public void doSaveAs() {
}
@Override
public void init(IEditorSite site, IEditorInput input)
throws PartInitException {
setSite(site);
setInput(input);
this.col = ((CollectionEditorInput) input).getObject();
setPartName(col.getName());
}
@Override
public boolean isDirty() {
return false; // our editor currently does not support editing
}
@Override
public boolean isSaveAsAllowed() {
return false;
}
@Override
protected void createPages() {
final Composite composite = new Composite(getContainer(), SWT.FILL);
ImageRegistry reg = MeclipsePlugin.getDefault().getImageRegistry();
composite.setLayout(new MigLayout("wrap 9",
"[][][][40px!][][40px!][][][]", "[30px!][]"));
Label find = new Label(composite, SWT.FILL);
find.setLayoutData("w 30!");
find.setText(getCaption("collectionEditor.find"));
query = new Text(composite, SWT.FILL);
query.setLayoutData("w 100: 500: 600");
query.setText("{}");
Label skip = new Label(composite, SWT.FILL);
skip.setText(getCaption("collectionEditor.skip"));
skipV = new Text(composite, SWT.FILL);
skipV.setText("0");
skipV.setLayoutData("w 40px!");
skipV.addListener(SWT.DefaultSelection, runQuery);
Label limit = new Label(composite, SWT.FILL);
limit.setText(getCaption("collectionEditor.limit"));
limitV = new Text(composite, SWT.FILL);
limitV.setText("10");
limitV.setLayoutData("w 40px!");
limitV.addListener(SWT.DefaultSelection, runQuery);
search = new Button(composite, SWT.PUSH);
search.setToolTipText(getCaption("collectionEditor.tooltip.search"));
search.setImage(reg.get(MeclipsePlugin.FIND_IMG_ID));
search.addListener(SWT.Selection, runQuery);
more = new Button(composite, SWT.PUSH);
more.setToolTipText(getCaption("collectionEditor.tooltip.next"));
more.setImage(reg.get(MeclipsePlugin.GET_NEXT_IMG_ID));
more.setEnabled(false);
more.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event arg0) {
loadEntries(false);
}
});
all = new Button(composite, SWT.PUSH);
all.setToolTipText(String.format(
getCaption("collectionEditor.tooltip.getAll"), maxElements));
all.setImage(reg.get(MeclipsePlugin.GET_ALL_IMG_ID));
all.setEnabled(false);
all.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event arg0) {
loadEntries(true);
}
});
bar = new ExpandBar(composite, SWT.V_SCROLL);
bar.setLayoutData("span, w 100%-20px !,h 100%-50px !");
cursor = col.getCollection().find().limit(maxElements);
loadEntries(false);
int index = addPage(composite);
setPageText(index, getCaption("collectionEditor.tab.properties"));
}
@Override
public void setFocus() {
}
@Override
public void resourceChanged(IResourceChangeEvent arg0) {
// TODO Auto-generated method stub
}
public void createExpander(final ExpandBar bar, Map<String, Object> o,
CollectionType collType) {
// First item
final Composite composite = new Composite(bar, SWT.FILL);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.marginLeft = layout.marginTop = layout.marginRight = layout.marginBottom = 10;
composite.setLayout(layout);
final ExpandItem expandItem = new ExpandItem(bar, SWT.NONE, 0);
for (Object key : o.keySet()) {
if (key == "_id" || key == "_ns")
continue;
Label keyLabel = new Label(composite, SWT.FILL);
keyLabel.setText(key.toString());
Label valueLabel = new Label(composite, SWT.WRAP);
Object value = o.get(key);
valueLabel.setText(String.valueOf(value));
}
Object value;
switch (collType) {
case SYSINDEX :
value = o.get("ns").toString() + "." + o.get("name").toString();
break;
default :
value = o.get("_id");
break;
}
expandItem.setText(String.valueOf(value));
expandItem.setControl(composite);
expandItem.setHeight(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
}
@SuppressWarnings("unchecked")
public void loadEntries(boolean ignoreLimit) {
if (cursor != null) {
int count = 0;
while (cursor.hasNext()) {
createExpander(bar,
(Map<String, Object>) cursor.next().toMap(),
col.getType());
if (count++ == maxElements && !ignoreLimit) {
break;
}
}
more.setEnabled(cursor.hasNext());
all.setEnabled(cursor.hasNext());
}
}
}