com.netxforge.base.cdo.ui.CDOStorageView.java Source code

Java tutorial

Introduction

Here is the source code for com.netxforge.base.cdo.ui.CDOStorageView.java

Source

/*******************************************************************************
 * Copyright (c) 4 mrt. 2014 NetXForge.
 * 
 * This program is free software: you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later
 * version.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
 * details. You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>
 * 
 * Contributors: Christophe Bouhier - initial API and implementation and/or
 * initial documentation
 *******************************************************************************/
package com.netxforge.base.cdo.ui;

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.observable.ChangeEvent;
import org.eclipse.core.databinding.observable.IChangeListener;
import org.eclipse.core.databinding.observable.IObservable;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.map.IObservableMap;
import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
import org.eclipse.core.databinding.observable.set.IObservableSet;
import org.eclipse.emf.cdo.session.CDOSession;
import org.eclipse.jface.databinding.viewers.ObservableListTreeContentProvider;
import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
import org.eclipse.jface.databinding.viewers.TreeStructureAdvisor;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.part.ViewPart;

import com.google.inject.Inject;
import com.netxforge.base.cdo.ICDOData;
import com.netxforge.netxstudio.data.cdo.IClientCDODataProvider;

/**
 * A view for the CDO System. Access the repository and get running sessions,
 * transactions and views.
 * 
 * @author Christophe Bouhier
 * 
 */
public class CDOStorageView extends ViewPart {

    @Inject
    IClientCDODataProvider clientDataProvider;

    private TreeViewer treeViewer;

    public CDOStorageView() {
    }

    @Override
    public void createPartControl(Composite parent) {
        parent.setLayout(new FillLayout());

        treeViewer = new TreeViewer(parent, SWT.NONE);

        Tree tree = treeViewer.getTree();
        tree.setHeaderVisible(true);
        tree.setLinesVisible(true);

        {
            TreeViewerColumn tblViewerC = new TreeViewerColumn(treeViewer, SWT.LEFT);

            TreeColumn tblclmnName = tblViewerC.getColumn();
            tblclmnName.setWidth(200);
            tblclmnName.setText("Provider");
        }
        {
            TreeViewerColumn tblViewerC = new TreeViewerColumn(treeViewer, SWT.LEFT);

            TreeColumn tblclmnName = tblViewerC.getColumn();
            tblclmnName.setWidth(200);
            tblclmnName.setText("Session (S)");

        }
        {
            TreeViewerColumn tblViewerC = new TreeViewerColumn(treeViewer, SWT.LEFT);

            TreeColumn tblclmnName = tblViewerC.getColumn();
            tblclmnName.setWidth(150);
            tblclmnName.setText("Transaction (S)");
        }

        // {
        // TableViewerColumn tblViewerC = new TableViewerColumn(tableViewer,
        // SWT.LEFT);
        // TableColumn tblclmnName = tblViewerC.getColumn();
        // tblclmnName.setWidth(150);
        // tblclmnName.setText("View)");
        // }

        initDataBindings();
    }

    @Override
    public void setFocus() {
    }

    public void initDataBindings() {

        @SuppressWarnings("unused")
        DataBindingContext ctx = new DataBindingContext();

        ObservableListTreeContentProvider listTreeContentProvider = new ObservableListTreeContentProvider(
                new CDOObservableFactory(), new CDODataTreeStructureAdvisor());

        treeViewer.setContentProvider(listTreeContentProvider);

        IObservableSet knownElements = listTreeContentProvider.getKnownElements();

        IObservableMap[] labelMaps = new IObservableMap[2];

        labelMaps[0] = BeanProperties.value(ICDOData.class, "session").observeDetail(knownElements);

        labelMaps[1] = BeanProperties.value(ICDOData.class, "transaction").observeDetail(knownElements);

        ILabelProvider labelProvider = new ObservableMapLabelProvider(labelMaps) {

            @Override
            public String getColumnText(Object element, int columnIndex) {
                if (element instanceof ICDOData) {
                    ICDOData data = (ICDOData) element;
                    switch (columnIndex) {
                    case 0: {
                        return "Data instance: " + data.hashCode();
                    }
                    case 1: {
                        if (data.hasSession()) {
                            return data.getSession().toString();
                        } else {
                            return "Session not set";
                        }
                    }
                    case 2: {
                        if (data.hasTransaction()) {
                            return data.getTransaction().toString();
                        } else {
                            return "Transaction not set";
                        }
                    }
                    }
                }
                return super.getColumnText(element, columnIndex);
            }
        };

        treeViewer.setLabelProvider(labelProvider);

        // Use the concrete class, to make sure we have the bean methods.
        IObservableList dataObservable = BeanProperties.list(IClientCDODataProvider.class, "CDODataCollection")
                .observe(clientDataProvider);

        dataObservable.addChangeListener(new IChangeListener() {
            @Override
            public void handleChange(ChangeEvent event) {
                System.out.println("Change on our observable" + event);
            }

        });

        treeViewer.setInput(dataObservable);
    }

    public class CDODataTreeStructureAdvisor extends TreeStructureAdvisor {
        @Override
        public Object getParent(Object element) {

            return null;
        }

        @Override
        public Boolean hasChildren(Object element) {

            if (element instanceof ICDOData) {
                ICDOData data = (ICDOData) element;
                // Make sure we don't open a session by observing it.
                if (data.hasSession()) {
                    if (data.getSession().getViews().length > 0) {
                        return true;
                    }
                }
            }
            return super.hasChildren(element);
        }
    }

    public class CDOObservableFactory implements IObservableFactory {

        @Override
        public IObservable createObservable(Object target) {
            IObservable ol = null;
            if (target instanceof IObservableList) {
                ol = (IObservable) target;
            } else if (target instanceof CDOSession) {
                // Observe the Views in the CDOSession.
                // These objects are not
            }
            return ol;
        }

    }

}