package fr.opensagres.mongodb.ide.ui.editors.collection; import java.net.UnknownHostException; import java.util.Locale; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.IOpenListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.OpenEvent; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.TreeViewerColumn; import org.eclipse.nebula.widgets.pagination.tree.PageableTree; import org.eclipse.nebula.widgets.pagination.tree.forms.FormPageableTree; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Tree; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.widgets.FormToolkit; import com.mongodb.BasicDBObject; import com.mongodb.DBCollection; import com.mongodb.DBObject; import com.mongodb.MongoException; import fr.opensagres.mongodb.ide.core.model.Collection; import fr.opensagres.mongodb.ide.core.model.Database; import fr.opensagres.mongodb.ide.core.model.Server; import fr.opensagres.mongodb.ide.core.model.Users; import fr.opensagres.mongodb.ide.ui.ServerUI; import fr.opensagres.mongodb.ide.ui.editors.AbstractToolbarFormPage; import fr.opensagres.mongodb.ide.ui.internal.Messages; import fr.opensagres.mongodb.ide.ui.internal.Trace; import fr.opensagres.mongodb.ide.ui.viewers.DBObjectContentProvider; import fr.opensagres.mongodb.ide.ui.viewers.DBObjectKeyColumnLabelProvider; import fr.opensagres.mongodb.ide.ui.viewers.DBObjectPageResultLoader; import fr.opensagres.mongodb.ide.ui.viewers.DBObjectTypeColumnLabelProvider; import fr.opensagres.mongodb.ide.ui.viewers.DBObjectValueColumnLabelProvider; import fr.opensagres.mongodb.ide.ui.viewers.MongoPageResultContentProvider; import fr.opensagres.mongodb.ide.ui.viewers.ViewerHelper; public class DocumentsPage extends AbstractToolbarFormPage { public static final String ID = "documents"; public DocumentsPage(CollectionEditor editor) { super(editor, ID, Messages.DocumentsPage_title); } @Override protected void fillBody(IManagedForm managedForm, FormToolkit toolkit) { Composite body = managedForm.getForm().getBody(); body.setLayout(new GridLayout()); Composite left = toolkit.createComposite(body); left.setLayout(new GridLayout()); left.setLayoutData(new GridData(GridData.FILL_BOTH)); // DBCollection dbCollection = null; try { dbCollection = getColllection().getDBCollection(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (MongoException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 1) Create pageable tree with 10 items per page // This SWT Component create internally a SWT Tree+JFace TreeViewer int pageSize = 50; PageableTree pageableTree = new FormPageableTree(left, SWT.NONE, SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL, toolkit, pageSize, MongoPageResultContentProvider.getInstance(), FormPageableTree.getDefaultPageRendererTopFactory(), FormPageableTree.getDefaultPageRendererBottomFactory()); pageableTree.setLayoutData(new GridData(GridData.FILL_BOTH)); pageableTree.setLocale(Locale.ENGLISH); pageableTree.getViewer().getTree() .setLayoutData(new GridData(GridData.FILL_BOTH)); // 2) Initialize the tree viewer + SWT Tree TreeViewer viewer = pageableTree.getViewer(); viewer.setContentProvider(DBObjectContentProvider.getInstance()); //viewer.setLabelProvider(new LabelProvider()); Tree tree = viewer.getTree(); tree.setHeaderVisible(true); tree.setLinesVisible(true); // 3) Create Tree columns with sort of paginated list. createColumns(viewer); // 3) Set current page to 0 to refresh the tree pageableTree.setPageLoader(new DBObjectPageResultLoader<DBObject>( dbCollection, getColllection().getShellCommandManager())); pageableTree.setCurrentPage(0); initialize(viewer); } public Collection getColllection() { return ((CollectionEditor) getEditor()).getModelObject(); } private static void createColumns(final TreeViewer viewer) { // First column is for the Key TreeViewerColumn col = ViewerHelper.createColumn(viewer, Messages.columnKey, 200, DBObjectKeyColumnLabelProvider.getInstance()); // col.getColumn().addSelectionListener( // new SortTreeColumnSelectionListener("name")); // Second column is for the Value col = ViewerHelper.createColumn(viewer, Messages.columnValue, 300, DBObjectValueColumnLabelProvider.getInstance()); // col.getColumn().addSelectionListener( // new SortTreeColumnSelectionListener("address.name")); // Third column is for the Type col = ViewerHelper.createColumn(viewer, Messages.columnType, 100, DBObjectTypeColumnLabelProvider.getInstance()); // col.getColumn().addSelectionListener( // new SortTreeColumnSelectionListener("address.name")); // // TableColumnLayout layout = new TableColumnLayout(); // comp.setLayout( layout ); // // 4 // layout.setColumnData( column1, new ColumnWeightData( 30 ) ); // layout.setColumnData( column2, new ColumnWeightData( 60 ) ); } private void initialize(final TreeViewer viewer) { // Open Server, Database, Collection editor when user double click on // the node viewer.addOpenListener(new IOpenListener() { public void open(OpenEvent event) { try { IStructuredSelection sel = (IStructuredSelection) event .getSelection(); Object data = sel.getFirstElement(); if (data instanceof BasicDBObject) { ServerUI.editDocument((BasicDBObject) data, getColllection()); } } catch (Exception e) { if (Trace.SEVERE) { Trace.trace(Trace.STRING_SEVERE, "Could not open document", e); } } } }); MenuManager menuManager = new MenuManager("#PopupMenu"); menuManager.setRemoveAllWhenShown(true); final Shell shell = getSite().getShell(); menuManager.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager mgr) { fillContextMenu(shell, mgr, viewer); } }); Menu menu = menuManager.createContextMenu(viewer.getControl()); viewer.getControl().setMenu(menu); getSite().registerContextMenu(menuManager, viewer); getSite().setSelectionProvider(viewer); } protected void fillContextMenu(Shell shell, IMenuManager menu, TreeViewer viewer) { // get selection but avoid no selection or multiple selection Server server = null; Database database = null; Collection collection = null; Users users = null; IStructuredSelection selection = (IStructuredSelection) viewer .getSelection(); if (selection.size() == 1) { Object obj = selection.getFirstElement(); if (obj instanceof Server) { server = (Server) obj; } else if (obj instanceof Database) { database = (Database) obj; } else if (obj instanceof Collection) { collection = (Collection) obj; } else if (obj instanceof Users) { users = (Users) obj; } } } }