org.eclipse.cdt.dstore.ui.widgets.DataElementTableViewer.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.cdt.dstore.ui.widgets.DataElementTableViewer.java

Source

package org.eclipse.cdt.dstore.ui.widgets;

/*
 * Copyright (c) 2001, 2002 International Business Machines Corporation. All rights reserved.
 * This program and the accompanying materials are made available under the terms of
 * the Common Public License which accompanies this distribution.
 */

import org.eclipse.cdt.dstore.ui.*;
import org.eclipse.cdt.dstore.ui.actions.*;
import org.eclipse.cdt.dstore.core.client.*;
import org.eclipse.cdt.dstore.core.model.*;
import org.eclipse.cdt.dstore.extra.internal.extra.*;

import java.util.*;

import org.eclipse.ui.part.*;
import org.eclipse.ui.*;
import org.eclipse.core.resources.*;

import org.eclipse.jface.viewers.*;
import org.eclipse.jface.action.*;

import org.eclipse.swt.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.events.*;

public class DataElementTableViewer extends TableViewer
        implements ISelected, Listener, IDataElementViewer, SelectionListener, ControlListener {
    private class DelayedRefresher extends Thread {
        private ArrayList _elements;
        private Shell _shell;

        public DelayedRefresher(ArrayList elements) {
            _shell = _currentInput.getDataStore().getDomainNotifier().findShell();
            _elements = elements;
        }

        public void run() {
            try {
                Thread.currentThread().sleep(1000);
            } catch (InterruptedException e) {
                System.out.println(e);
            }

            if (_shell != null) {
                Display d = _shell.getDisplay();
                d.asyncExec(new Runnable() {
                    public void run() {
                        System.out.println("updating...");
                        //updateItems(getTable(), _elements, new ArrayList(0));
                    }
                });
            }

            _refresher = null;

        }

    }

    private ViewFilter _viewFilter;

    private DataElement _currentDescriptor;
    private DataElement _currentInput;

    private ObjectWindow _parent;

    private DataElement _selected;
    private DataElement _expanded;
    private DataElement _property;

    private IOpenAction _openEditorAction;

    private boolean _isShowing;
    private boolean _isWorking;

    private ObjectSelectionChangedListener _listener;

    private DelayedRefresher _refresher = null;
    private boolean _isContainable = false;

    private TableLayout _layout;
    private ArrayList _attributeColumns;

    public DataElementTableViewer(ObjectWindow parent, Table table) {
        super(table);

        _layout = new TableLayout();

        computeLayout();

        _parent = parent;

        _property = null;
        _viewFilter = new ViewFilter();
        _viewFilter.setEnableContents(false);
        _viewFilter.setDepth(1);
        addFilter(_viewFilter);

        setContentProvider(new DataElementTableContentProvider());
        _isShowing = false;
        _isWorking = false;

        _attributeColumns = new ArrayList();

        setVisibility(false);

    }

    /**
     * Sent when the location (x, y) of a control changes relative
     * to its parent (or relative to the display, for <code>Shell</code>s).
     *
     * @param e an event containing information about the move
     */
    public void controlMoved(ControlEvent e) {
    }

    /**
     * Sent when the size (width, height) of a control changes.
     *
     * @param e an event containing information about the resize
     */
    public void controlResized(ControlEvent e) {
        //*** DKM - leave this out for now
        // computeLayout();
    }

    public void setFocus() {
        getTable().setFocus();
    }

    public void setListener(ObjectSelectionChangedListener listener) {
        _listener = listener;
        addSelectionChangedListener(listener);
    }

    public void removeListener(ObjectSelectionChangedListener listener) {
        _listener = null;
        if (listener != null) {
            removeSelectionChangedListener(listener);
        }
    }

    public void setBackground(int r, int g, int b) {
        Table table = getTable();

        Display display = table.getDisplay();
        table.setBackground(new Color(display, r, g, b));
    }

    public void setForeground(int r, int g, int b) {
        Table table = getTable();

        Display display = table.getDisplay();
        table.setForeground(new Color(display, r, g, b));
    }

    public void setFont(FontData data) {
        Table table = getTable();

        Display display = table.getDisplay();
        table.setFont(new Font(display, data));
    }

    public void setShowing(boolean flag) {
        _isShowing = flag;
    }

    public boolean isShowing() {
        return _isShowing;
    }

    public void handleEvent(Event e) {
        Widget widget = e.widget;
    }

    public String getSchemaPath() {
        String path = _parent.getDataStore().getAttribute(DataStoreAttributes.A_PLUGIN_PATH);

        return path;
    }

    public Shell getShell() {
        if (!getControl().isDisposed()) {
            try {
                return getControl().getShell();
            } catch (Exception e) {
            }
        }

        return null;
    }

    public boolean listeningTo(DomainEvent ev) {
        if (_currentInput != null && !getTable().isDisposed()) {
            DataElement parent = (DataElement) ev.getParent();

            if ((parent == _selected) || (parent == _currentInput)
                    || (parent == _expanded)/* ||       
                                            _currentInput.contains(parent, 1)*/
            ) {
                return true;
            }
        }
        return false;
    }

    private Item findItemFor(Table widget, Object res) {
        Item[] items = widget.getItems();
        if (items != null) {
            for (int i = 0; i < items.length; i++) {
                Item child = items[i];
                if (!child.isDisposed()) {
                    Object data = child.getData();
                    if (data == res) {
                        return child;
                    }
                }
            }
        }

        return null;
    }

    public void domainChanged(DomainEvent ev) {
        _isWorking = true;

        boolean selectionListening = _listener.isEnabled();
        if (selectionListening) {
            _listener.enable(false);
        }

        DataElement parent = (DataElement) ev.getParent();
        if (parent.isDeleted()) {
            if (parent == _currentInput) {
                clearView();
            } else {
                setSelectionToWidget((ISelection) null, false);
                internalRefresh(_currentInput);
            }
        } else if (_currentInput == null) {
            _currentInput = null;
            setInput(null);
        } else if (_currentInput == parent) {

            if (_currentInput.getDescriptor() != _currentDescriptor) {
                _currentDescriptor = _currentInput.getDescriptor();
                computeLayout();
            }

            internalRefresh(parent);

        } else {
            synchronized (parent) {
                try {
                    Table table = getTable();
                    //table.setRedraw(false);
                    Item item = findItemFor(table, parent);
                    if (item != null) {
                        updateItem(item, parent);
                    }
                    //table.setRedraw(true);
                } catch (Exception e) {
                    System.out.println(e);
                }

            }
        }

        _isWorking = false;
        if (selectionListening) {
            _listener.enable(true);
        }
    }

    public void enable(boolean flag) {
        if (flag) {
            //   internalRefresh(_currentInput);
        }
    }

    private void internalRefresh(DataElement parent) {
        super.internalRefresh(parent, false);
    }

    /*
    private void internalRefresh(DataElement parent)
    {
    try
       {
      DataElementTableContentProvider contentProvider = (DataElementTableContentProvider)getContentProvider();
          
      Table table = getTable();
      {               
     ArrayList associated = contentProvider.getList(_currentInput);
        
         
     // remove those that are gone   
     TableItem[] items = table.getItems();
     ArrayList toRemove = new ArrayList();
     for (int i = 0; i < items.length; i++) 
         {
        TableItem item = items[i];
        if (item != null)
            {
           DataElement data = (DataElement)item.getData();
           if (!associated.contains(data))
               {
              toRemove.add(item);
               }
           else if (data == null || data.isDeleted() ||
               !_viewFilter.select(this, data, null))
               {
              toRemove.add(item);
               }
            }
         }
         
         
     ScrollBar vBar = table.getVerticalBar();
     ScrollBar hBar = table.getHorizontalBar();
        
     if (_listener.isEnabled())
         {
        vBar.setEnabled(false);
        hBar.setEnabled(false);
        table.setRedraw(false);
         }
         
     updateItems(table, associated, toRemove);
        
     if (_listener.isEnabled())
         {
        vBar.setEnabled(true);
        hBar.setEnabled(true);
        table.setRedraw(true);
         }
         
     if (table.getItemCount() == 0) 
         {
        table.removeAll();
         }
      }
       }
    catch (Exception e)
       {
      e.printStackTrace();
      System.out.println(e);
       }            
    }    
        
    private synchronized void updateItems(Table table, ArrayList elements, ArrayList recycled)
    {
    int maxAdd = (recycled.size() > 100) ? recycled.size() : 100;
    int numAdded = 0;
        
    // first update existing ones
    for (int i = (elements.size() - 1); i >= 0; i--)
       {
      DataElement child = (DataElement)elements.get(i);   
      TableItem item = (TableItem)findItemFor(table, child);
      if (item != null)
      {
     if (!item.getText().equals(child.getValue()))
         {
        updateItem(item, child);
         }
         
     // remove from list
     elements.remove(child);
      }
       }
        
        
        
      int totalItems = table.getItemCount();     
        
    // then create new ones
    for (int i = (elements.size() - 1); (i >= 0) && (numAdded < maxAdd); i--)
       {      
      DataElement child = (DataElement)elements.get(i);         
      TableItem item = null;
      if (_viewFilter.select(this, child, null))
      {                      
     if (recycled.size() > 0)
         {
        item = (TableItem)recycled.get(0);
        recycled.remove(0);
         }
     else
         {
         item = (TableItem)newItem(table, SWT.NONE,totalItems +  numAdded);
        numAdded++;
         }
         
     // remember element we are showing
     if (true) 
         {
        associate(child, item);
         } 
     else 
         {
        item.setData(child);
        mapElement(child, item);   
         }
        
     DataElementLabelProvider provider = (DataElementLabelProvider)getLabelProvider();
     // need to really do an update though to register properly
     item.setText(0, provider.getColumnText(child, 0));
     item.setImage(0, provider.getColumnImage(child, 0));
     ArrayList attributes = child.getAssociated("attributes");
     for (int a = 0; a < attributes.size(); a++)
         {
        DataElement attribute = (DataElement)attributes.get(a);
        item.setText(a + 1, attribute.getName());
         }
        
     //***updateItem(item, child);          
      }
      elements.remove(child);
       }
        
        
    if (recycled.size() > 0)
       {      
      table.setRedraw(false);
          
      for (int i = 0; i < recycled.size(); i++)
      {
     TableItem item = (TableItem)recycled.get(i);
     item.dispose();
     item = null;
      }
          
      table.setRedraw(true);
          
      recycled.clear();
       }
        
    if (elements.size() > 0)
       {       
      if (_refresher == null)
      {
     _refresher = new DelayedRefresher(elements);
     _refresher.start();
      }
       }   
    }
        
        
    protected Item newItem(Widget parent, int flags, int ix)  
    {
    return new TableItem((Table)parent, flags, ix);
    }
    */

    public void doExpand(DataElement obj) {
        DataElement root = obj.dereference();
        setSelected(obj);
        setExpanded(root);
        root.expandChildren();
    }

    public void setExpanded(DataElement element) {
        _expanded = element;
    }

    public ObjectWindow getParent() {
        return _parent;
    }

    public void setInput(DataElement object) {
        inputChanged(object, _currentInput);
    }

    protected void inputChanged(Object object, Object oldInput) {
        if (object == null) {
            _currentInput = null;
            setVisibility(false);
            return;
        }

        if (getTable().isDisposed()) {
            return;
        }

        boolean selectionListening = _listener.isEnabled();
        if (selectionListening) {
            if (_currentInput != object) {
                if (_currentInput == null) {
                    setVisibility(true);
                }

                boolean newType = _currentInput == null
                        || (_currentInput.getDescriptor() != ((DataElement) object).getDescriptor());

                _currentInput = (DataElement) object;
                _currentDescriptor = _currentInput.getDescriptor();

                if (newType) {
                    computeLayout();
                }

                internalRefresh(_currentInput, true);
                _isShowing = true;
            }
        }
    }

    public void setVisibility(boolean flag) {
        Table table = getTable();
        if (table != null)
            table.setVisible(flag);
    }

    public void clearView() {
        Control table = getTable();
        if (table != null) {
            synchronized (table) {
                try {
                    table.setRedraw(false);
                    getTable().removeAll();
                    table.setRedraw(true);
                } catch (Exception e) {
                    System.out.println(e);
                }
            }
        }
    }

    public void resetView(DataElement parent) {
        resetView(parent, true);
    }

    public synchronized void resetView(DataElement parent, boolean labelRefresh) {
        if (_isShowing && _currentInput != null && parent != null) {
            if (parent.isDeleted()) {
                parent = null;
                resetView();
            } else {
                Control table = getTable();
                if (table != null) {
                    try {
                        internalRefresh(parent, labelRefresh);

                        DataElement selected = getSelected();
                        select(selected);
                    } catch (Exception e) {
                        System.out.println(e);
                        setInput(_currentInput);
                    }
                }
            }
        }
    }

    public void resetView() {
        resetView(true);
    }

    public synchronized void resetView(boolean labelRefresh) {
        if (_isShowing && _currentInput != null) {
            boolean selectionListening = _listener.isEnabled();
            if (selectionListening) {
                Control table = getTable();
                if (table != null) {
                    try {
                        internalRefresh(_currentInput, true);
                        DataElement selected = getSelected();
                        select(selected);

                    } catch (Exception e) {
                        System.out.println(e);
                        setInput(_currentInput);
                    }
                }
            }
        }
    }

    public void setSelected(DataElement selected) {
        if (_selected != selected && selected != null) {
            _selected = selected;
            Table table = getTable();
            Widget widget = findItem(_selected);
            if (widget != null) {
                int index = table.indexOf((TableItem) widget);
                table.setSelection(index);
            }
        }
    }

    public DataElement getSelected() {
        return _selected;
    }

    public Object getInput() {
        return _currentInput;
    }

    public DataElement findElement(DataElement oldElement) {
        DataElement result = oldElement.getDataStore().replaceDeleted(oldElement);
        if (result != null) {
            return result;
        } else {
            return oldElement;
        }
    }

    public void select(DataElement object) {
        if (object != null && (_currentInput != null)) {
            String type = object.getType();
            String name = object.getName();
            reveal(object);
            Widget widget = findItem(object);

            if (widget != null) {
                ArrayList selection = new ArrayList();
                selection.add(widget);
            }
        }
    }

    public void setFilter(DataElement type) {
        DataElement oldType = _viewFilter.getType();
        if ((oldType != type) && (type != null)) {
            _viewFilter.setType(type);
        }
    }

    public DataElement getFilter() {
        return _viewFilter.getType();
    }

    public void setProperty(DataElement property) {
        DataElementTableContentProvider provider = (DataElementTableContentProvider) getContentProvider();

        if (property != null && provider != null && property != provider.getProperty()) {
            _property = property;
            provider.setProperty(property);
        }
    }

    public DataElement getProperty() {
        return _property;
    }

    public void setOpenAction(IOpenAction action) {
        _openEditorAction = action;
    }

    public void setContainable(boolean isContainable) {
        _isContainable = isContainable;
    }

    protected void handleDoubleSelect(SelectionEvent event) {
        if (_openEditorAction == null) {
            _openEditorAction = new OpenEditorAction(_selected);
        }

        if (_selected != null) {
            DataElement type = _selected.getDescriptor();
            if (type != null && _isContainable) {
                if (type.isOfType("Container Object", true)) {
                    _selected.expandChildren();
                    _parent.setInput(_selected);
                }
            }

            _openEditorAction.setSelected(_selected);
            _openEditorAction.run();
        }
    }

    public void refreshView(DataElement relation, DataElement filter) {
        setFilter(filter);
        setProperty(relation);
        computeLayout();
        internalRefresh(_currentInput, true);
    }

    public boolean isWorking() {
        return _isWorking;
    }

    public void dispose() {
        getTable().dispose();
    }

    private void computeLayout() {
        if (_currentInput != null) {
            _attributeColumns.clear();

            Table table = getTable();
            table.removeControlListener(this);

            // get column information

            // find first column type
            DataElement col1Type = _viewFilter.getType();
            TableColumn[] columns = table.getColumns();
            int numColumns = 0;
            if (columns != null)
                numColumns = columns.length;

            if (col1Type != null) {
                DataStore dataStore = col1Type.getDataStore();
                TableColumn tc = null;
                if (numColumns > 0 && columns[0] != null) {
                    tc = columns[0];
                } else {
                    _layout.addColumnData(new ColumnWeightData(200));

                    int ralignment = SWT.LEFT;
                    ArrayList rattributeFormats = col1Type.getAssociated(dataStore.getAttributesRelation());
                    if (rattributeFormats.size() > 0) {
                        DataElement rattributeFormat = (DataElement) rattributeFormats.get(0);
                        if (rattributeFormat.getName().equals("Integer")
                                || rattributeFormat.getName().equals("Float")) {
                            ralignment = SWT.RIGHT;
                        }
                    }

                    tc = new TableColumn(table, ralignment, 0);
                    tc.addSelectionListener(this);
                }

                DataElementLabelProvider provider = (DataElementLabelProvider) getLabelProvider();

                tc.setText(provider.getText(col1Type));

                _attributeColumns.add(col1Type);

                // find attributes of filter type
                ArrayList attributeTypes = col1Type.getAssociated(dataStore.getAttributesRelation());
                for (int i = 0; i < attributeTypes.size(); i++) {
                    DataElement attributeType = (DataElement) attributeTypes.get(i);

                    TableColumn atc = null;
                    if (numColumns > i + 1) {
                        atc = (TableColumn) columns[i + 1];
                    } else {
                        _layout.addColumnData(new ColumnWeightData(100));

                        int alignment = SWT.RIGHT;
                        ArrayList attributeFormats = attributeType.getAssociated(dataStore.getAttributesRelation());
                        if (attributeFormats.size() > 0) {
                            DataElement attributeFormat = (DataElement) attributeFormats.get(0);
                            if (attributeFormat.getName().equals("String")) {
                                alignment = SWT.LEFT;
                            }
                        }

                        atc = new TableColumn(table, alignment, i + 1);
                        atc.addSelectionListener(this);
                    }

                    _attributeColumns.add(attributeType);

                    atc.setText(provider.getText(attributeType));
                }

                while (attributeTypes.size() + 1 < numColumns) {
                    columns[numColumns - 1].dispose();
                    numColumns--;
                }

                // compute widths
                columns = table.getColumns();
                Rectangle clientA = table.getClientArea();
                int totalWidth = clientA.width - 5;
                int averageWidth = totalWidth / columns.length;
                int firstWidth = averageWidth;
                if (averageWidth < 150) {
                    int difference = 150 - averageWidth;
                    firstWidth = 150;
                    averageWidth -= difference / columns.length;

                    if (averageWidth < 80) {
                        averageWidth = 80;
                    }
                }

                for (int i = columns.length - 1; i >= 0; i--) {
                    if (i == 0) {
                        if (columns.length == 0) {
                            columns[i].setWidth(totalWidth);
                        } else {
                            columns[i].setWidth(firstWidth);
                        }
                    } else {
                        try {
                            columns[i].setWidth(averageWidth);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }

                if (attributeTypes.size() > 0) {
                    table.setHeaderVisible(true);
                } else {
                    table.setHeaderVisible(false);
                }
            } else {
                table.setHeaderVisible(false);
            }

            table.setLayout(_layout);
            table.addControlListener(this);
        }
    }

    public void widgetDefaultSelected(SelectionEvent e) {
        widgetSelected(e);
    }

    public void widgetSelected(SelectionEvent e) {
        Widget source = e.widget;

        TableColumn col = (TableColumn) source;
        int index = getTable().indexOf(col);

        DataElementSorter sorter = (DataElementSorter) getSorter();
        if (sorter == null) {
            sorter = new DataElementSorter(DE.P_NAME);
        }

        if (index > 0) {
            sorter.setSortAttribute((DataElement) _attributeColumns.get(index));
        } else {
            sorter.setSortAttribute(null);
        }

        setSorter(sorter);
        //internalRefresh(_currentInput, false);
    }

    public void setSorter(ViewerSorter sorter) {
        boolean sameSort = (getSorter() == sorter);
        super.setSorter(sorter);

        if (sameSort) // force a refresh
            internalRefresh(_currentInput, false);
    }
}