zigen.plugin.db.ui.editors.QueryViewEditor2.java Source code

Java tutorial

Introduction

Here is the source code for zigen.plugin.db.ui.editors.QueryViewEditor2.java

Source

/*
 * Copyright (c) 2007 - 2009 ZIGEN
 * Eclipse Public License - v 1.0
 * http://www.eclipse.org/legal/epl-v10.html
 */
package zigen.plugin.db.ui.editors;

import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.action.GroupMarker;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IContributionManager;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.CoolBar;
import org.eclipse.swt.widgets.CoolItem;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorActionBarContributor;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.part.MultiPageEditorPart;

import zigen.plugin.db.DbPlugin;
import zigen.plugin.db.DbPluginConstant;
import zigen.plugin.db.ImageCacher;
import zigen.plugin.db.core.IDBConfig;
import zigen.plugin.db.core.TableElement;
import zigen.plugin.db.core.Transaction;
import zigen.plugin.db.preference.PreferencePage;
import zigen.plugin.db.ui.actions.CopyRecordDataAction;
import zigen.plugin.db.ui.actions.ITableViewEditorAction;
import zigen.plugin.db.ui.actions.SelectAllRecordAction;
import zigen.plugin.db.ui.editors.event.TableDefaultSortListener;
import zigen.plugin.db.ui.editors.event.TableKeyAdapter;
import zigen.plugin.db.ui.editors.event.TableKeyEventHandler;
import zigen.plugin.db.ui.editors.event.TableSortListener;
import zigen.plugin.db.ui.editors.internal.CellEditorType;
import zigen.plugin.db.ui.internal.Column;
import zigen.plugin.db.ui.internal.ITable;
import zigen.plugin.db.ui.jobs.ChangeColorJob;
import zigen.plugin.db.ui.jobs.RecordCountForQueryJob;
import zigen.plugin.db.ui.jobs.RecordSearchJob;
import zigen.plugin.db.ui.jobs.SqlExecForPagerJob;
import zigen.plugin.db.ui.jobs.SqlExecJob;
import zigen.plugin.db.ui.views.StatusLineContributionItem;

public class QueryViewEditor2 extends MultiPageEditorPart
        implements ITableViewEditor, IQueryViewEditor, IPageChangeListener {
    protected int limit = 0;
    protected int offset = 0;

    public void pageChanged(int status, int offset, int limit) {
        this.offset = offset;
        this.limit = limit;
        updateTableViewer(offset, limit);
    }

    protected void updateTableViewer(int offset, int limit) {
        if (limit == 0) {
            offset = 0;
        }
        QueryViewEditorInput ei = (QueryViewEditorInput) getEditorInput();
        Transaction trans = Transaction.getInstance(config);
        SqlExecForPagerJob job = new SqlExecForPagerJob(trans, query, ei.getSecondarlyId(), true, offset, limit);
        // job.setPriority(Job.SHORT);
        job.setUser(false);
        job.schedule();
    }

    private ImageCacher ic = ImageCacher.getInstance();

    private Table table;

    private TableViewer viewer;

    private TableElement[] elements;

    private String query;

    private IDBConfig config = null;

    private TableSortListener sortListener;

    protected StatusLineContributionItem responseTimeItem;

    protected String responseTime;

    protected SelectAllRecordAction selectAllRecordAction;

    protected CopyRecordDataAction copyAction;

    protected ChangeColorJob changeColorJob;

    protected Label infoLabel;

    TableKeyEventHandler handler;

    public QueryViewEditor2() {
        super();
    }

    public void setInfomationText(String message) {
        infoLabel.setText(message);
    }

    private void makeActions() {
        selectAllRecordAction = new SelectAllRecordAction();
        copyAction = new CopyRecordDataAction();
        selectAllRecordAction.setActiveEditor(this);
        copyAction.setActiveEditor(this);

    }

    protected void createPages() {
        makeActions();
        createLogPage(); // dummy page
    }

    private void createLogPage() {
        Composite composite = new Composite(getContainer(), SWT.NONE);
        composite.setLayout(new FillLayout());
        int index = addPage(composite);
        setPageText(index, "log"); //$NON-NLS-1$
    }

    private boolean hasContributionItem(IStatusLineManager manager, String id) {
        IContributionItem[] items = manager.getItems();
        for (int i = 0; i < items.length; i++) {
            IContributionItem item = items[i];
            if (item.getId().equals(id)) {
                responseTimeItem = (StatusLineContributionItem) item;
                return true;
            }
        }
        return false;
    }

    public void contributeToStatusLine() {
        IEditorSite site = super.getEditorSite();
        IActionBars actionBars = site.getActionBars();
        IStatusLineManager manager = actionBars.getStatusLineManager();

        if (!hasContributionItem(manager, "RecordCount")) { //$NON-NLS-1$
            responseTimeItem = new StatusLineContributionItem("RecordCount"); //$NON-NLS-1$
            manager.add(responseTimeItem);
        }

    }

    private void createMessageArea(Composite parent) {
        Composite composite = new Composite(parent, SWT.NONE);
        composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 2;
        gridLayout.makeColumnsEqualWidth = true;
        gridLayout.marginHeight = 0;
        gridLayout.marginWidth = 0;
        gridLayout.horizontalSpacing = 0;
        gridLayout.verticalSpacing = 0;
        composite.setLayout(gridLayout);

        infoLabel = new Label(composite, SWT.NONE);
        infoLabel.setText(""); //$NON-NLS-1$
        infoLabel.setForeground(new Color(null, 255, 0, 0));
        // Composite composite = new Composite(tool, SWT.NONE);
        GridData data1 = new GridData(GridData.FILL_HORIZONTAL);
        data1.verticalIndent = 1;
        infoLabel.setLayoutData(data1);

        ToolBar toolbar = new ToolBar(composite, SWT.FLAT);
        toolbar.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
        ToolItem reloeadItem = new ToolItem(toolbar, SWT.NONE);
        reloeadItem.setImage(ic.getImage(DbPlugin.IMG_CODE_REFRESH));
        reloeadItem.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                //            QueryViewEditorInput ei = (QueryViewEditorInput) getEditorInput();
                //            Transaction trans = Transaction.getInstance(config);
                //            SqlExecJob job = new SqlExecJob(trans, query, ei.getSecondarlyId(), true);
                //            // job.setPriority(Job.SHORT);
                //            job.setUser(false);
                //            job.schedule();

                QueryViewEditorInput ei = (QueryViewEditorInput) getEditorInput();
                Transaction trans = Transaction.getInstance(config);
                SqlExecForPagerJob job = new SqlExecForPagerJob(trans, query, ei.getSecondarlyId(), true, offset,
                        limit);
                // job.setPriority(Job.SHORT);
                job.setUser(false);
                job.schedule();

            }
        });
    }

    private void createMainPage() {
        Composite main = new Composite(getContainer(), SWT.NONE);
        GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 1;
        gridLayout.makeColumnsEqualWidth = false;
        gridLayout.marginHeight = 1;
        gridLayout.marginWidth = 1;
        gridLayout.horizontalSpacing = 0;
        gridLayout.verticalSpacing = 0;
        main.setLayout(gridLayout);

        createMessageArea(main);

        table = new Table(main, SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
        GridData gridData2 = new GridData(GridData.FILL_BOTH);
        table.setLayoutData(gridData2);
        table.setHeaderVisible(true);
        table.setLinesVisible(true);
        table.setFont(DbPlugin.getDefaultFont());

        viewer = new TableViewer(table);
        setHeaderColumn(table);
        viewer.setContentProvider(new TableViewContentProvider());
        viewer.setLabelProvider(new TableViewLabelProvider());

        table.addKeyListener(new KeyAdapter() {

            public void keyPressed(KeyEvent e) {
                if (e.keyCode == SWT.F2) {
                    int row = handler.getSelectedRow();
                    handler.editTableElement(row, 1);

                }
            }
        });

        table.addFocusListener(new FocusAdapter() {

            public void focusGained(FocusEvent e) {
                if (table.getSelectionIndex() == -1) {
                    table.select(0);
                    table.notifyListeners(SWT.Selection, null);

                }
                IActionBars bars = getEditorSite().getActionBars();
                setGlobalActionForEditor(bars);
                bars.updateActionBars();

            }
        });

        viewer.addSelectionChangedListener(new ISelectionChangedListener() {

            public void selectionChanged(SelectionChangedEvent e) {
                selectionChangeHandler(e);
            }
        });

        viewer.setInput(elements);

        changeColorJob = new ChangeColorJob(table);
        changeColorJob.setPriority(ChangeColorJob.LONG);
        changeColorJob.setUser(false);
        changeColorJob.schedule();

        handler = new TableKeyEventHandler(this);
        setCellModify(viewer, handler);

        columnsPack(table);
        hookContextMenu();
        contributeToStatusLine();

        createFooterArea(main);

        int index = addPage(main);

        setActivePage(getPageCount() - 1);

        getSite().setSelectionProvider(viewer);

    }

    CoolItem pagerItem;
    QueryViewerPager pager;

    private void createFooterArea(Composite parent) {
        CoolBar coolBar1 = new CoolBar(parent, SWT.NONE);
        GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
        coolBar1.setLayoutData(gridData);
        GridLayout gridLayout = new GridLayout(1, false);
        gridLayout.marginHeight = 0;
        gridLayout.marginWidth = 0;
        gridLayout.horizontalSpacing = 0;
        gridLayout.verticalSpacing = 0;
        coolBar1.setLayout(gridLayout);
        pagerItem = new CoolItem(coolBar1, SWT.FLAT);

        limit = DbPlugin.getDefault().getPreferenceStore().getInt(PreferencePage.P_MAX_VIEW_RECORD);
        pager = new QueryViewerPager(limit);
        pagerItem.setControl(pager.createStackedButtons(coolBar1));
        computeSize(pagerItem);
        pager.setPageNo(1);
        pager.addPageChangeListener(this);
        //      infoLabelItem = new CoolItem(coolBar1, SWT.NONE);
        //      infoLabel = new Label(coolBar1, SWT.NONE);
        //      infoLabel.setText(""); //$NON-NLS-1$
        //      infoLabel.setForeground(new Color(null, 255, 0, 0));
        //      // infoLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        //      infoLabelItem.setControl(infoLabel);
        //
        //      computeSize(infoLabelItem);
    }

    private void computeSize(CoolItem item) {
        Control control = item.getControl();
        Point pt = control.computeSize(SWT.DEFAULT, SWT.DEFAULT);
        pt = item.computeSize(pt.x + 5, pt.y);
        item.setSize(pt);
    }

    CellEditor[] cellEditors;

    public void refleshAction() {
        // selectAllRecordAction.refresh();
        copyAction.refresh();
    }

    void selectionChangeHandler(SelectionChangedEvent event) {
        refleshAction();
    }

    private void setCellModify(TableViewer viewer, TableKeyEventHandler handler) {
        if (elements == null)
            return;
        final IActionBars bars = getEditorSite().getActionBars();
        TableElement element = elements[0];
        int size = element.getColumns().length + 1;
        String[] properties = new String[size];
        zigen.plugin.db.core.TableColumn[] cols = element.getColumns();
        cellEditors = new CellEditor[size];
        TableKeyAdapter keyAdapter = new TableKeyAdapter(handler);
        for (int i = 0; i < cellEditors.length; i++) {
            properties[i] = String.valueOf(i);
            if (i > 0) {
                CellEditor cellEditor = new TextCellEditor(table, i);

                if (cellEditor.getControl() instanceof Text) {
                    Text txt = (Text) cellEditor.getControl();
                    txt.setEditable(false);
                }
                cellEditor.getControl().addKeyListener(keyAdapter);
                cellEditor.getControl().addTraverseListener(keyAdapter);
                cellEditor.getControl().addFocusListener(new FocusAdapter() {

                    public void focusGained(FocusEvent e) {
                        bars.clearGlobalActionHandlers();
                        bars.updateActionBars();
                    }

                    public void focusLost(FocusEvent e) {
                        // setInfomationText(EDIT_MODE_OFF); non message
                    }
                });
                cellEditors[i] = cellEditor;

            }
        }
        viewer.setColumnProperties(properties);
        viewer.setCellModifier(new ICellModifier() {

            public boolean canModify(Object element, String property) {
                return true;
            }

            public Object getValue(Object element, String property) {
                int index = Integer.parseInt(property);
                if (element instanceof TableElement) {
                    TableElement elem = (TableElement) element;
                    Object obj = elem.getItems()[index - 1];
                    if (obj != null) {
                        if (obj instanceof String) {
                            return (String) obj;
                        } else {
                            return CellEditorType.getDataTypeName(elem.getColumns()[index]);
                        }
                    } else {
                        return ""; //$NON-NLS-1$

                    }
                }
                return null;
            }

            public void modify(Object element, String property, Object value) {
            }

        });
        viewer.setCellEditors(cellEditors);
    }

    public void setTotalCount(int dispCount, long totalCount) {
        NumberFormat format = NumberFormat.getInstance();
        String displayCount = format.format(dispCount);
        String displayTotalCount = format.format(totalCount);

        StringBuffer sb = new StringBuffer();
        sb.append(displayCount);
        sb.append(Messages.getString("QueryViewEditor2.3")); //$NON-NLS-1$

        if (!"".equals(displayTotalCount)) { //$NON-NLS-1$
            if ("-1".equals(displayTotalCount)) { //$NON-NLS-1$
                ;
            } else {
                sb.append(" / "); //$NON-NLS-1$
                sb.append(Messages.getString("QueryViewEditor2.7")); //$NON-NLS-1$
                sb.append(totalCount);
                sb.append(Messages.getString("QueryViewEditor2.8")); //$NON-NLS-1$
            }
        } else {
            sb.append(Messages.getString("QueryViewEditor2.9")); //$NON-NLS-1$
        }
        sb.append(Messages.getString("QueryViewEditor2.10")); //$NON-NLS-1$
        sb.append(responseTime);
        sb.append("]"); //$NON-NLS-1$

        setPageText(getActivePage(), sb.toString());

        pager.setLimit(limit);
        pager.setRecordCount((int) totalCount);
        computeSize(pagerItem);
    }

    public void setResponseTime(String responseTime) {
        this.responseTime = responseTime;

        if (responseTimeItem != null && responseTime != null && !"".equals(responseTime)) { //$NON-NLS-1$
            StringBuffer sb = new StringBuffer();
            sb.append(Messages.getString("QueryViewEditor2.13")); //$NON-NLS-1$
            sb.append(responseTime);
            responseTimeItem.setText(sb.toString());

        }
    }

    public void update(String query, TableElement[] elements, String responseTime, boolean isReload) {
        try {
            this.query = query;

            // remove dummy page
            if (getPageText(0).equals("log")) {
                removePage(0);
            }

            if (viewer == null) {
                this.elements = elements;
                createMainPage();
            } else {
                TableElement element = elements[0];
                if (isSameColumn(element)) {
                    viewer.setInput(elements);
                    TableColumn col = viewer.getTable().getColumn(0);
                    col.pack();
                    TableDefaultSortListener defaultSortListener = new TableDefaultSortListener(this, 0);
                    col.removeSelectionListener(sortListener);
                    col.addSelectionListener(defaultSortListener);
                    viewer.getTable().getColumn(0).notifyListeners(SWT.Selection, null);
                    col.removeSelectionListener(defaultSortListener);
                    sortListener = new TableSortListener(this, 0);
                    col.addSelectionListener(sortListener);

                } else {
                    this.elements = elements;

                    if (true) {
                        if (getPageCount() > 0) {
                            removePage(getPageCount() - 1);
                        }
                    }

                    createMainPage();
                }
            }

            if (!isReload) {
                if (pager != null)
                    pager.setPageNo(1);

                QueryViewEditorInput ei = (QueryViewEditorInput) getEditorInput();
                DbPlugin.showView(DbPluginConstant.VIEW_ID_SQLExecute, ei.getSecondarlyId());
            }

            setResponseTime(responseTime);

            int dispCnt = elements.length - 1;
            setTotalCount(dispCnt, -1); //$NON-NLS-1$

            QueryViewEditorInput input = (QueryViewEditorInput) getEditorInput();
            RecordCountForQueryJob job2 = new RecordCountForQueryJob(Transaction.getInstance(config), query,
                    input.getSecondarlyId(), dispCnt);
            job2.setUser(false);
            job2.setPriority(RecordCountForQueryJob.LONG);
            job2.schedule();

        } catch (Exception e) {
            DbPlugin.getDefault().showErrorDialog(e);
        }
    }

    private void hookContextMenu() {
        MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
        menuMgr.setRemoveAllWhenShown(true);
        menuMgr.addMenuListener(new IMenuListener() {

            public void menuAboutToShow(IMenuManager manager) {
                getContributor().fillContextMenu(manager);
                setExtensionPoint(manager);
            }
        });
        Menu menu = menuMgr.createContextMenu(viewer.getControl());
        viewer.getControl().setMenu(menu);
        getSite().registerContextMenu(menuMgr, viewer);
    }

    private QueryViewerContributor getContributor() {
        IEditorActionBarContributor contributor = getEditorSite().getActionBarContributor();
        if (contributor instanceof QueryViewerContributor) {
            return (QueryViewerContributor) contributor;
        } else {
            return null;
        }
    }

    private void setHeaderColumn(Table table) {
        if (elements != null) {
            // TableColumn row = new TableColumn(table, SWT.LEFT);
            TableColumn row = new TableColumn(table, SWT.RIGHT);

            sortListener = new TableSortListener(this, 0);
            row.addSelectionListener(sortListener);
            row.pack();
            TableElement element = elements[0];
            zigen.plugin.db.core.TableColumn[] columns = element.getColumns();
            for (int i = 0; i < columns.length; i++) {
                zigen.plugin.db.core.TableColumn tColumn = columns[i];
                TableColumn col = new TableColumn(table, SWT.LEFT);
                col.setText(tColumn.getColumnName());
                col.addSelectionListener(new TableSortListener(this, i + 1));
                col.pack();
            }
        }
    }

    private int max_column_size = 600;

    private void columnsPack(Table table) {
        table.setVisible(false);
        TableColumn[] cols = table.getColumns();
        for (int i = 0; i < cols.length; i++) {
            TableColumn c = cols[i];
            c.pack();

            if (c.getWidth() > max_column_size) {
                c.setWidth(max_column_size);
            }
        }
        table.setVisible(true);
    }

    public void dispose() {
        disposeExtensionPoint();
        super.dispose();
    }

    public void doSave(IProgressMonitor monitor) {
    }

    public void doSaveAs() {
    }

    public boolean isSaveAsAllowed() {
        return false;
    }

    public void init(IEditorSite site, IEditorInput editorInput) throws PartInitException {
        super.init(site, editorInput);
        try {

            if (editorInput instanceof QueryViewEditorInput) {
                QueryViewEditorInput input = (QueryViewEditorInput) editorInput;
                this.config = input.getConfig();
                this.query = input.getQuery();

                setPartName("[" + config.getDbName() + Messages.getString("QueryViewEditor2.17")); //$NON-NLS-1$ //$NON-NLS-2$
            }

        } catch (Exception e) {
            DbPlugin.getDefault().showErrorDialog(e);
        }
    }

    protected void pageChange(int newPageIndex) {
        super.pageChange(newPageIndex);
    }

    public TableViewer getViewer() {
        return viewer;
    }

    public ITable getTableNode() {
        return null;
    }

    public TableElement getHeaderTableElement() {
        if (this.elements.length > 0) {
            return elements[0];
        }
        return null;
    }

    protected void initializeViewerFont(ISourceViewer viewer) {
        StyledText styledText = viewer.getTextWidget();
        styledText.setFont(DbPlugin.getDefaultFont());
    }

    void setGlobalActionForEditor(IActionBars bars) {
        bars.clearGlobalActionHandlers();
        copyAction.refresh();
        bars.setGlobalActionHandler(ActionFactory.COPY.getId(), copyAction);
        bars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(), selectAllRecordAction);
        bars.updateActionBars();

    }

    public void setFocus() {

        if (table != null && copyAction != null && selectAllRecordAction != null) {
            IActionBars bars = getEditorSite().getActionBars();
            bars.clearGlobalActionHandlers();
            setGlobalActionForEditor(bars);
            table.setFocus();
            setResponseTime(responseTime);
        }
    }

    private boolean isSameColumn(TableElement target) {
        if (this.elements == null)
            return false;

        TableElement old = this.elements[0];
        zigen.plugin.db.core.TableColumn[] oldCols = old.getColumns();
        zigen.plugin.db.core.TableColumn[] targetCols = target.getColumns();
        int oldLen = oldCols.length;
        int targetLen = targetCols.length;

        if (oldLen != targetLen)
            return false;

        for (int i = 0; i < oldCols.length; i++) {
            zigen.plugin.db.core.TableColumn column1 = oldCols[i];
            zigen.plugin.db.core.TableColumn column2 = targetCols[i];
            if (!column1.getColumnName().equals(column2.getColumnName())) {
                return false;
            }
        }
        return true;
    }

    public IDBConfig getDBConfig() {
        return config;
    }

    public String getQuery() {
        return query;
    }

    public void changeColumnColor(Column column) {
        // changeColorJob.setSelectedColumn(column);
        // changeColorJob.schedule();

    }

    public void changeColumnColor() {
        changeColorJob.setTable(table);
        changeColorJob.schedule();
    }

    public void editTableElement(Object element, int column) {
        throw new UnsupportedOperationException("The method is a unmounting."); //$NON-NLS-1$
    }

    public String getCondition() {
        throw new UnsupportedOperationException("The method is a unmounting. "); //$NON-NLS-1$
    }

    private List extensionList = new ArrayList();

    private void setExtensionPoint(IMenuManager manager) {

        IExtensionRegistry registry = Platform.getExtensionRegistry();
        IExtensionPoint point = registry
                .getExtensionPoint(DbPlugin.getDefault().getBundle().getSymbolicName() + ".queryEditor");
        IExtension[] extensions = point.getExtensions();
        for (int i = 0; i < extensions.length; i++) {
            IConfigurationElement[] elements = extensions[i].getConfigurationElements();
            add(manager, elements);
        }

    }

    private void add(IMenuManager menu, IConfigurationElement[] elems) {

        try {
            for (int k = 0; k < elems.length; k++) {

                IConfigurationElement element = elems[k];
                String name = element.getName();

                if ("contributor".equals(name)) {
                    try {
                        ITableViewEditorAction action = (ITableViewEditorAction) element
                                .createExecutableExtension("class");
                        action.setText(element.getAttribute("label"));
                        action.setToolTipText(element.getAttribute("tooltipText"));
                        action.setActiveEditor(this);
                        action.selectionChanged(viewer.getSelection());
                        extensionList.add(action);

                        String menubarPath = element.getAttribute("menubarPath");
                        IMenuManager subMenu = menu.findMenuUsingPath(menubarPath);

                        if (subMenu != null) {
                            subMenu.add(action);
                            add(subMenu, element.getChildren());
                        } else {
                            IContributionItem item = menu.findUsingPath(menubarPath);
                            if (item != null) {
                                if (item instanceof Separator) {
                                    Separator sep = (Separator) item;
                                    IContributionManager mgr = sep.getParent();
                                    mgr.add(action);
                                    add(subMenu, element.getChildren());
                                } else if (item instanceof GroupMarker) {
                                    GroupMarker sep = (GroupMarker) item;
                                    IContributionManager mgr = sep.getParent();
                                    mgr.add(action);
                                    add(subMenu, element.getChildren());
                                } else {
                                    DbPlugin.log("unexpected Type " + item.getClass().getName());
                                }
                            }
                        }

                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                } else if ("menu".equals(name)) {
                    String _id = element.getAttribute("id");
                    String _label = element.getAttribute("label");
                    IMenuManager subMenu = menu.findMenuUsingPath(_id);
                    if (subMenu == null) {
                        subMenu = new MenuManager(_label, _id);
                        menu.add(subMenu);
                        add(subMenu, element.getChildren());
                    }

                } else if ("separator".equals(name)) {
                    String _name = element.getAttribute("name");
                    menu.add(new Separator(_name));

                } else if ("groupMarker".equals(name)) {
                    String _name = element.getAttribute("name");
                    menu.add(new GroupMarker(_name));

                }

            }
        } catch (Exception e) {
            DbPlugin.log(e);
        }
    }

    private void disposeExtensionPoint() {
        for (Iterator iter = extensionList.iterator(); iter.hasNext();) {
            ITableViewEditorAction action = (ITableViewEditorAction) iter.next();
            action.setActiveEditor(null);
            action = null;
        }
    }

    public void setEnabled(boolean enabled) {
        ;
    }

    public int getRecordLimit() {
        return 0;
    }

    public int getRecordOffset() {
        return 0;
    }
}