com.nokia.s60ct.gui.viewer.DCTreeViewer.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.s60ct.gui.viewer.DCTreeViewer.java

Source

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/
package com.nokia.s60ct.gui.viewer;

import interfaces.CellModifier;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.swt.widgets.Widget;

import cellEditors.BoolComboEditor;
import cellEditors.ComboROCellEditor;
import cellEditors.FileCellEditor;
import cellEditors.FolderCellEditor;
import cellEditors.IPairItem;
import cellEditors.IntCellEditor;
import cellEditors.IntComboEditor;
import cellEditors.RealCellEditor;
import cellEditors.StringComboEditor;
import configurationemf.Configuration;
import configurationemf.ICellEditorProvider;
import configurationemf.IDynamicColumnProvider;
import configurationemf.ISequenceValueProvider;
import configurationemf.LeafSetting;
import configurationemf.ParentSetting;
import configurationemf.provider.SettingItemProvider;
import cursor.TreeCursor;

public class DCTreeViewer extends TreeViewer {

    private Map availableColumns = new HashMap();

    CellModifier cellModifierProvider = null;
    ICellEditorProvider cellEditorProvider = null;

    boolean settingCanModify = true;
    int currentIndex = -1;
    TreeCursor cursor = null;
    boolean showAll = false;

    TextCellEditor textCellEditor;
    BoolComboEditor boolComboEditor;
    StringComboEditor stringComboEditor;
    IntComboEditor intComboEditor;
    FileCellEditor fileCellEditor;
    ComboROCellEditor comboROeditor;
    IntCellEditor intCellEditor;

    private Object[][] CELL_EDITOR_TYPE = new Object[][] { new Object[] { ICellEditorProvider.STRING_TEXT, null },
            new Object[] { ICellEditorProvider.BOOLEAN_COMBO, null },
            new Object[] { ICellEditorProvider.INT_TEXT, null },
            new Object[] { ICellEditorProvider.REAL_TEXT, null },
            new Object[] { ICellEditorProvider.COMBO_RO, null },
            new Object[] { ICellEditorProvider.COMBO_INT, null },
            new Object[] { ICellEditorProvider.COMBO_STRING, null },
            new Object[] { ICellEditorProvider.FILE_BUTTON, null },
            new Object[] { ICellEditorProvider.FOLDER_BUTTON, null } };
    private static final int CE_TYPE = 0;
    private static final int CE_OBJECT = 1;

    public DCTreeViewer(final Tree tree) {
        super(tree);
        this.setUseHashlookup(true);
        this.setCellModifier(this.getCellModifier());
        initCellEditors(tree);
        createCursor(tree);
        this.setCellModifier(createCellModifier());
    }

    public TreeCursor getCursor() {
        return cursor;
    }

    private void createCursor(final Tree tree) {
        cursor = new TreeCursor(tree, SWT.NONE);
        cursor.setBackground(tree.getBackground());
        cursor.addSelectionListener(new SelectionAdapter() {
            public void widgetDefaultSelected(SelectionEvent e) {
                TreeItem row = cursor.getRow();
                int column = cursor.getColumn();
                DCTreeViewer.this.editElement(row.getData(), column);
            }

            public void widgetSelected(SelectionEvent e) {
                tree.setSelection(cursor.getRow());

            }
        });
        cursor.addMouseListener(new MouseAdapter() {
            public void mouseDown(MouseEvent e) {
                if (e.button == 1) {
                    TreeItem row = cursor.getRow();
                    int column = cursor.getColumn();
                    DCTreeViewer.this.editElement(row.getData(), column);
                } else if (e.button == 3) {
                    cursor.setMenu(tree.getMenu());
                }
            }
        });

    }

    private void initCellEditors(final Tree tree) {
        for (int i = 0; i < CELL_EDITOR_TYPE.length; i++) {
            int type = (Integer) CELL_EDITOR_TYPE[i][CE_TYPE];
            CellEditor cellEditor = null;
            switch (type) {
            case ICellEditorProvider.STRING_TEXT:
                cellEditor = new TextCellEditor(tree);
                break;
            case ICellEditorProvider.BOOLEAN_COMBO:
                cellEditor = new BoolComboEditor(tree);
                break;
            case ICellEditorProvider.INT_TEXT:
                cellEditor = new IntCellEditor(tree);
                break;
            case ICellEditorProvider.COMBO_RO:
                cellEditor = new BoolComboEditor(tree);
                break;
            case ICellEditorProvider.COMBO_INT:
                cellEditor = new IntComboEditor(tree, new String[0]);
                break;
            case ICellEditorProvider.COMBO_STRING:
                cellEditor = new StringComboEditor(tree, new String[0]);
                break;
            case ICellEditorProvider.FILE_BUTTON:
                cellEditor = new FileCellEditor(tree);
                break;
            case ICellEditorProvider.FOLDER_BUTTON:
                cellEditor = new FolderCellEditor(tree);
                break;
            case ICellEditorProvider.REAL_TEXT:
                cellEditor = new RealCellEditor(tree);
                break;
            }
            ;
            CELL_EDITOR_TYPE[i][CE_OBJECT] = cellEditor;

        }

    }

    public void setShowAll(boolean showAll) {
        if (this.showAll != showAll) {
            this.showAll = showAll;
            this.refresh();
        }
    }

    public void editElement(Object element, int column) {
        ICellEditorProvider cepro = getCellEditorProvider();
        if (cepro != null) {
            CellEditor cellEditor = createCellEditor(cepro.getCellEditor(element, column));
            if (cellEditor != null) {
                if (cellEditor instanceof IPairItem) {
                    ((IPairItem) cellEditor).setPairs(cepro.getPairItems(element, column));
                }
                applyCellEditor(column, cellEditor);
            } else
                return;
        }
        super.editElement(element, column);
    }

    private void applyCellEditor(int column, CellEditor cellEditor) {
        CellEditor[] cellEditors = getCellEditors();
        if (cellEditors == null || cellEditors.length <= column)
            cellEditors = new CellEditor[this.getTree().getColumnCount()];
        cellEditors[column] = cellEditor;
        setCellEditors(cellEditors);
    }

    private CellEditor createCellEditor(int editorType) {
        CellEditor cellEditor = null;
        for (int i = 0; i < CELL_EDITOR_TYPE.length && cellEditor == null; i++) {
            int type = (Integer) CELL_EDITOR_TYPE[i][CE_TYPE];
            CellEditor editor = (CellEditor) CELL_EDITOR_TYPE[i][CE_OBJECT];
            if (type == editorType)
                cellEditor = editor;
        }
        return cellEditor;
    }

    public void setCurrentIndex(int currentIndex) {
        if (this.currentIndex != currentIndex) {
            this.currentIndex = currentIndex;
            this.refresh();
        }
    }

    public int getCurrentIndex() {
        return currentIndex;
    }

    public int getSequenceSize(Object parentSetting) {
        if (getLabelProvider() instanceof IDynamicColumnProvider) {
            IDynamicColumnProvider dcp = (IDynamicColumnProvider) getLabelProvider();
            return dcp.getSequenceNumber(parentSetting);
        }
        return 0;
    }

    protected void createChildren(Widget widget) {
        super.createChildren(widget);

    }

    protected Item newItem(Widget parent, int flags, int ix) {

        return super.newItem(parent, flags, ix);
    }

    protected Object[] getRawChildren(Object parent) {
        Object[] original = super.getRawChildren(parent);
        Object[] result = null;
        if (showAll) {
            if (original.length > 0 && parent instanceof ParentSetting) {
                IDynamicColumnProvider svp = (IDynamicColumnProvider) this.getLabelProvider();
                int fNumber = Math.max(1, svp.getSequenceNumber(parent));
                result = new Object[original.length * fNumber];
                for (int i = 0; i < fNumber; i++)
                    System.arraycopy(original, 0, result, original.length * i, original.length);
            } else
                result = original;
        } else
            result = original;
        return result;
    }

    public TreeItem getCursorItem() {
        return cursor.getRow();
    }

    public static int getValueIndex(TreeItem treeItem) {
        int itemIndex = treeItem.getParentItem().indexOf(treeItem);
        String stringIndex = Double.toString(Math.ceil(itemIndex / 2));
        stringIndex = stringIndex.substring(0, stringIndex.indexOf("."));
        int valueIndex = Integer.valueOf(stringIndex).intValue();
        return valueIndex;
    }

    Map elementOrder = new HashMap();

    protected void mapElement(Object element, Widget item) {
        super.mapElement(element, item);
        if (element instanceof LeafSetting && item.getData("index") == null) {
            Integer order = (Integer) elementOrder.get(element);
            if (order == null)
                order = Integer.valueOf(0);
            else
                order = Integer.valueOf(order.intValue() + 1);
            elementOrder.put(element, order);
            item.setData("index", order);
        }
    }

    protected void doUpdateItem(Item item, Object element) {
        super.doUpdateItem(item, element);

        IBaseLabelProvider blpro = this.getLabelProvider();
        IDynamicColumnProvider dcpro = null;
        ISequenceValueProvider svpro = null;
        TreeItem treeItem = (TreeItem) item;
        if (blpro instanceof ISequenceValueProvider && treeItem.getParentItem() != null) {
            int valueIndex = DCTreeViewer.getValueIndex(treeItem);
            svpro = (ISequenceValueProvider) blpro;
            String value = null;
            if (showAll) {
                value = svpro.getValueForFrame(element, valueIndex);
                Display display = getTree().getDisplay();
                if (valueIndex % 2 == 0)
                    treeItem.setBackground(display.getSystemColor(SWT.COLOR_GRAY));
            } else
                value = svpro.getValueForFrame(element, currentIndex > 0 ? currentIndex : 0);
            if (value != null) {
                ((TreeItem) item).setText(SettingItemProvider.SETTING_VALUE, value);
            }
        }
        if (blpro instanceof IDynamicColumnProvider) {
            dcpro = (IDynamicColumnProvider) this.getLabelProvider();
            Map map = dcpro.getConfValues(element);
            final Tree tree = getTree();
            for (Iterator it = map != null ? map.keySet().iterator() : null; it != null && it.hasNext();) {
                Configuration conf = (Configuration) it.next();
                String value = (String) map.get(conf);
                TreeColumn treeColumn = (TreeColumn) availableColumns.get(conf);
                int index = 0;
                if (treeColumn == null) {
                    index = tree.getColumnCount();
                    int[] currentOrder = tree.getColumnOrder();
                    int[] newOrder = new int[currentOrder.length + 1];
                    treeColumn = new TreeColumn(tree, SWT.NONE, index);

                    availableColumns.put(conf, treeColumn);
                    treeColumn.setText(conf.getName());
                    treeColumn.setData("index", Integer.valueOf(index));
                    tree.setColumnOrder(newOrder);
                } else
                    index = ((Integer) treeColumn.getData("index")).intValue();

                ((TreeItem) item).setText(index, value != null ? value : "ND");
                treeColumn.pack();
            }
            cursor.redraw();
        }

    }

    /*
     * this function must be called when input has been changed
     */
    public void removeAvailableColumns() {
        for (Iterator it = availableColumns.values().iterator(); it.hasNext();) {
            TreeColumn treeColumn = (TreeColumn) it.next();
            treeColumn.dispose();
        }
        availableColumns.clear();
    }

    private ICellModifier createCellModifier() {
        return new DCellModifier();
    }

    private class DCellModifier implements ICellModifier {

        public boolean canModify(Object element, String property) {
            return DCTreeViewer.this.getCellModifierProvider().canModify(element, property);

        }

        public Object getValue(Object element, String property) {
            return DCTreeViewer.this.getCellModifierProvider().getValue(element, property);
        }

        public void modify(Object element, String property, Object value) {
            String strValue = (String) value;
            if (strValue.equals(""))
                value = null;
            Object object = ((Item) element).getData();
            Object parent = getParentObject((TreeItem) element);
            DCTreeViewer.this.getCellModifierProvider().modify(parent, object, property, value);
        }
    }

    private Object getParentObject(TreeItem item) {
        TreeItem parentItem = item.getParentItem();
        if (parentItem != null)
            return parentItem.getData();
        else
            return getInput();
    }

    public CellModifier getCellModifierProvider() {
        if (cellModifierProvider == null) {
            IContentProvider contentProvider = this.getContentProvider();
            if (contentProvider instanceof CellModifier)
                cellModifierProvider = (CellModifier) contentProvider;
        }
        return cellModifierProvider;
    }

    public ICellEditorProvider getCellEditorProvider() {
        if (cellEditorProvider == null) {
            IBaseLabelProvider blp = getLabelProvider();
            if (blp instanceof ICellEditorProvider)
                cellEditorProvider = (ICellEditorProvider) blp;
        }
        return cellEditorProvider;
    }

}