org.pentaho.pms.ui.concept.editor.TableColumnTreeWidget.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.pms.ui.concept.editor.TableColumnTreeWidget.java

Source

/*!
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* 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 Lesser General Public License for more details.
*
* Copyright (c) 2002-2013 Pentaho Corporation..  All rights reserved.
*/

package org.pentaho.pms.ui.concept.editor;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Tree;
import org.pentaho.pms.schema.concept.ConceptUtilityInterface;

public class TableColumnTreeWidget extends TreeViewer implements ISelectionProvider, ITableModificationListener {

    // ~ Static fields/initializers ======================================================================================

    private static final Log logger = LogFactory.getLog(TableColumnTreeWidget.class);

    // ~ Instance fields =================================================================================================

    private ITableModel tableModel;

    private boolean decorate = true;

    private boolean showId = false;

    private String locale = null;

    // ~ Constructors ====================================================================================================

    /**
     * Shows only the properties defined in the given concept model. Refreshes itself in reaction to concept model
     * changes.
     */
    public TableColumnTreeWidget(final Composite parent, final int style, final ITableModel tableModel,
            final boolean decorate, final String locale) {
        super(new Tree(parent, style));
        this.tableModel = tableModel;
        this.tableModel.addTableModificationListener(this);
        this.decorate = decorate;
        this.locale = locale;
        createContents();
        showId(showId);
    }

    // ~ Methods =========================================================================================================

    /**
     * Used to toggle the display of IDs vs. localized names. Tree is refreshed as part of this call.
     */
    public void showId(final boolean showId) {
        this.showId = showId;
        refresh(true);
        expandAll();
    }

    public void tableModified(final TableModificationEvent e) {
        if (logger.isDebugEnabled()) {
            logger.debug("heard tableModel modification event: " + e);
        }
        // tree is small enough that we don't need to be smart about painting only changed nodes; paint everything
        refresh(true);
        expandAll();
    }

    protected void createContents() {
        getTree().addDisposeListener(new DisposeListener() {
            public void widgetDisposed(DisposeEvent e) {
                TableColumnTreeWidget.this.widgetDisposed(e);
            }
        });
        setContentProvider(new TableColumnTreeContentProvider());
        setLabelProvider(new TableColumnTreeLabelProvider());

        setInput("ignored");

        expandAll();
    }

    protected void widgetDisposed(final DisposeEvent e) {
        tableModel.removeTableModificationListener(this);
    }

    private class TableColumnTreeContentProvider implements ITreeContentProvider {
        protected final Object[] EMPTY_ARRAY = new Object[0];

        private TreeViewer viewer;

        protected TreeViewer getViewer() {
            return viewer;
        }

        public Object getParent(final Object element) {
            if (logger.isDebugEnabled()) {
                logger.debug("getParent arg is " + element);
            }
            if (tableModel.isColumn((ConceptUtilityInterface) element)) {
                return tableModel.getWrappedTable();
            } else {
                return null;
            }
        }

        public boolean hasChildren(final Object element) {
            if (logger.isDebugEnabled()) {
                logger.debug("hasChildren arg is " + element);
            }
            if (tableModel.isColumn((ConceptUtilityInterface) element)) {
                if (logger.isDebugEnabled()) {
                    logger.debug("hasChildren returning false");
                }
                return false;
            } else {
                if (logger.isDebugEnabled()) {
                    logger.debug("hasChildren returning true");
                }
                return true;
            }
        }

        public void dispose() {
            if (logger.isDebugEnabled()) {
                logger.debug("dispose");
            }
            // nothing to dispose
        }

        public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) {
            if (logger.isDebugEnabled()) {
                logger.debug("inputChanged");
            }
            this.viewer = (TreeViewer) viewer;
            // no need to adjust listeners
        }

        public Object[] getChildren(final Object parentElement) {
            if (logger.isDebugEnabled()) {
                logger.debug("getChildren arg is " + parentElement);
            }
            if (tableModel.isColumn((ConceptUtilityInterface) parentElement)) {
                return EMPTY_ARRAY;
            } else {
                return tableModel.getColumns();
            }
        }

        public Object[] getElements(final Object inputElement) {
            if (logger.isDebugEnabled()) {
                logger.debug("getElements arg is " + inputElement);
            }
            return new Object[] { tableModel.getWrappedTable() };
        }

    }

    private class TableColumnTreeLabelProvider implements ILabelProvider {

        public Image getImage(final Object element) {
            if (logger.isDebugEnabled()) {
                logger.debug("getImage arg is " + element);
            }
            if (decorate) {
                if (tableModel.isColumn((ConceptUtilityInterface) element)) {
                    return Constants.getImageRegistry(Display.getCurrent()).get("column");
                } else {
                    return Constants.getImageRegistry(Display.getCurrent()).get("table");
                }
            }
            return null;
        }

        public String getText(final Object element) {
            if (logger.isDebugEnabled()) {
                logger.debug("getText arg is " + element);
            }
            ConceptUtilityInterface conceptHolder = (ConceptUtilityInterface) element;

            String name = conceptHolder.getConcept().getName(locale);
            if (showId || null == name) {
                return conceptHolder.getId();
            } else {
                return name;
            }
        }

        public void addListener(final ILabelProviderListener listener) {
            // not used
        }

        public void dispose() {
            // not used
        }

        public boolean isLabelProperty(final Object element, final String property) {
            // not used
            return false;
        }

        public void removeListener(final ILabelProviderListener listener) {
            // not used
        }
    }

}