de.instanttouch.ui.scaffolding.swt.viewer.lazy.SnakeLazyTablePresenter.java Source code

Java tutorial

Introduction

Here is the source code for de.instanttouch.ui.scaffolding.swt.viewer.lazy.SnakeLazyTablePresenter.java

Source

/*******************************************************************************
 *  Copyright (c) 2015 Joachim Tessmer.
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License v1.0
 *  which accompanies this distribution, and is available at
 *  http://www.eclipse.org/legal/epl-v10.html
 *  
 *  Contributors:
 *      Joachim Tessmer - initial API and implementation
 *******************************************************************************/
package de.instanttouch.ui.scaffolding.swt.viewer.lazy;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILazyContentProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
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.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.forms.widgets.FormToolkit;

import de.instantouch.model.base.SnakeType;
import de.instantouch.model.base.ref.SnakeFile;
import de.instantouch.model.collections.SnakeList;
import de.instantouch.model.domain.SnakeModel;
import de.instantouch.model.domain.SnakeModelCoordinate;
import de.instantouch.model.exception.SnakeNotInitializedException;
import de.instantouch.model.exception.SnakeNotSupportedException;
import de.instantouch.model.exception.SnakeWrongTypeException;
import de.instantouch.model.log.SnakeLog;
import de.instanttouch.api.db.ISnakeDaoCrudResponse;
import de.instanttouch.api.model.ISnakeModification;
import de.instanttouch.api.model.ISnakeTypeListener;
import de.instanttouch.api.model.domain.ISnakeLazyListener;
import de.instanttouch.api.model.domain.ISnakeModel;
import de.instanttouch.db.dao.SnakeDao;
import de.instanttouch.db.dao.SnakeDaoLazyList;
import de.instanttouch.db.export.SnakeDaoExport;
import de.instanttouch.db.model.SnakeLazyList;
import de.instanttouch.db.model.SnakeOrderBy;
import de.instanttouch.db.model.SnakeQuery;
import de.instanttouch.db.model.SnakeSearch;
import de.instanttouch.ui.scaffolding.swt.Activator;
import de.instanttouch.ui.scaffolding.swt.dialog.SnakeDialog;
import de.instanttouch.ui.scaffolding.swt.error.SnakeExceptionHandler;
import de.instanttouch.ui.scaffolding.swt.extensions.SnakeDialogRegistry;
import de.instanttouch.ui.scaffolding.swt.presenter.SnakeComposite;
import de.instanttouch.ui.scaffolding.swt.presenter.SnakePresenter;
import de.instanttouch.ui.scaffolding.swt.presenter.SnakePresenterFactory;
import de.instanttouch.ui.scaffolding.swt.viewer.SnakeSection;

public class SnakeLazyTablePresenter extends SnakePresenter implements ILazyContentProvider {

    private static final int DYNAMIC_LOAD_START = 1;
    private static final String SORTING_PREFS = "sorting";
    private static final String FILTER_PREFS = "filterInfo";
    private static final String COLUMN_PREFS = "columnInfo";

    public static int sessionId = 0;

    public interface ITableUpdate {

        public void update(boolean bComplete);

    }

    public class ColumnInfo {

        protected String title;
        protected int width;
        protected boolean bVisible;

        public ColumnInfo(String title, int width) {
            super();
            this.title = title;
            this.width = width;
            this.bVisible = true;
        }

        public ColumnInfo(String title, String quickFilter, int width) {
            super();

            this.title = title;
            this.width = width;
            this.bVisible = true;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public int getWidth() {
            return width;
        }

        public void setWidth(int width) {
            this.width = width;
        }

        public boolean isVisible() {
            return bVisible;
        }

        public void setVisible(boolean bVisible) {
            this.bVisible = bVisible;
        }

    }

    protected List<ColumnInfo> allColumns = new ArrayList<ColumnInfo>();
    protected SnakeOrderBy currentSorting;
    protected SnakeSearch search;
    private SnakeLazyTableViewer viewer;

    protected SnakeLazyList lazyList;
    private SnakeComposite searchComposite;
    private SnakeSection filterSection;
    private Composite viewerComposite;
    private StackLayout viewerStack;

    private SnakeTableDataSession currentSession;
    private boolean isDragging = false;
    private Timer dynamicTimer;

    protected int pageSize = 30;
    private Label countlabel;

    public SnakeLazyTablePresenter(Composite parent, int style, SnakeType type) {
        super(parent, style, type);

        if (type == null) {
            throw new SnakeNotInitializedException("no type given");
        }
        if (!(type instanceof SnakeLazyList)) {
            throw new SnakeWrongTypeException("invalid type: " + type + " , SnakeLazyList expected");
        }

        lazyList = (SnakeLazyList) type;
        lazyList.addResultListener(new ISnakeLazyListener() {

            @Override
            public void onSearchResult(final int offset, final int count, final long totalCount) {

                if (viewer == null || viewer.getControl().isDisposed()) {
                    return;
                }

                Display display = viewer.getControl().getDisplay();
                if (display != null) {
                    display.syncExec(new Runnable() {

                        @Override
                        public void run() {

                            countlabel.setText("  " + String.valueOf(totalCount) + "  elements");
                            viewer.setItemCount((int) totalCount);

                            for (int i = offset; i < offset + count; i++) {
                                SnakeModel model = lazyList.get(i);
                                if (model != null) {
                                    if (!viewer.isBusy()) {
                                        viewer.replace(model, i);
                                    }
                                }
                            }
                        }
                    });
                }

            }

            @Override
            public void onError(String error) {
                SnakeLog.error(error);
            }
        });
        lazyList.setQueryDelay(0);

        search = new SnakeSearch("search");
        search.addListener(new ISnakeTypeListener() {

            @Override
            public void onChange(ISnakeModification modification) {
                reload();
            }
        });

        initTablePresenter();
    }

    private void initTablePresenter() {

        try {
            SnakeModel example = lazyList.getExample();
            if (example == null) {
                throw new SnakeNotSupportedException("no element creator available");
            }

            boolean tableCanBeUsed = true;
            for (SnakeType child : example.getChildren()) {
                if (child instanceof SnakeModelCoordinate) {
                    continue;
                }

                if (!child.handleAsBasic()) {
                    tableCanBeUsed = false;
                    break;
                }
            }

            for (SnakeType child : example.getChildren()) {
                if (child instanceof SnakeModelCoordinate) {
                    continue;
                }

                allColumns.add(new ColumnInfo(child.getName(), 100));
            }

        } catch (Exception e) {
            SnakeExceptionHandler.handle(e);
        }

    }

    public List<ColumnInfo> getVisibleColumns() {
        List<ColumnInfo> visible = new ArrayList<ColumnInfo>();

        for (ColumnInfo info : allColumns) {
            if (info.isVisible()) {
                visible.add(info);
            }
        }

        return visible;
    }

    public List<ColumnInfo> getHiddenColumns() {
        List<ColumnInfo> hidden = new ArrayList<ColumnInfo>();

        for (ColumnInfo info : allColumns) {
            if (!info.isVisible()) {
                hidden.add(info);
            }
        }

        return hidden;
    }

    public List<ColumnInfo> getAllColumns() {
        return Collections.unmodifiableList(allColumns);
    }

    public void addColumn(String title, int width) {
        ColumnInfo newColumn = new ColumnInfo(title, width);
        allColumns.add(newColumn);
    }

    public ColumnInfo findColumnByTitle(String title) {

        ColumnInfo founded = null;

        for (ColumnInfo columnInfo : allColumns) {
            if (columnInfo.getTitle().equalsIgnoreCase(title)) {
                founded = columnInfo;
                break;
            }
        }

        return founded;
    }

    public int getColumnIndexByTitle(String title) {

        int index = -1;

        for (int i = 0; i < getVisibleColumns().size(); i++) {
            ColumnInfo info = getVisibleColumns().get(i);
            if (info.getTitle().equalsIgnoreCase(title)) {
                index = i;
                break;
            }

        }

        return index;
    }

    public List<SnakeTableColumnInfo> neededColumns() {
        List<SnakeTableColumnInfo> neededColumns = new ArrayList<SnakeTableColumnInfo>();

        for (ColumnInfo columnInfo : getVisibleColumns()) {
            SnakeTableColumnInfo info = new SnakeTableColumnInfo();
            info.setTitle(columnInfo.getTitle());
            info.setPreferredWidth(columnInfo.getWidth());
            neededColumns.add(info);
        }

        return neededColumns;
    }

    @Override
    public void init(Object layoutData, boolean bValidate) {

        composite.setLayout(new GridLayout());
        composite.setLayoutData(new GridData(GridData.FILL_BOTH));

        boolean hasOk = false;

        Composite filterComposite = new Composite(composite, SWT.NONE);
        filterComposite.setLayout(new GridLayout(3, false));
        filterComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        SnakeComposite searchComposite = SnakePresenterFactory.presentType(filterComposite, search, false, false);

        FormToolkit toolkit = new FormToolkit(composite.getDisplay());

        countlabel = toolkit.createLabel(filterComposite, "0  elements");
        countlabel.setLayoutData(new GridData(100, 25));

        Composite toolbarComposite = new Composite(filterComposite, SWT.NONE);
        toolbarComposite.setLayout(new FillLayout());
        toolbarComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        Button btColumns = new Button(toolbarComposite, SWT.PUSH);
        btColumns.setImage(Activator.getImage("icons/list.png"));
        btColumns.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                selectColumns();
            }

        });

        Button btExport = new Button(toolbarComposite, SWT.PUSH);
        btExport.setImage(Activator.getImage("icons/export-icon.png"));
        btExport.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                export();
            }

        });

        final Button btDynamic = new Button(toolbarComposite, SWT.TOGGLE);
        btDynamic.setImage(Activator.getImage("icons/time-go-icon.png"));
        btDynamic.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {

                boolean active = btDynamic.getSelection();
                if (active) {
                    handleDynamic();
                } else {
                    stopDynamicTimer();
                }
            }

        });

        Button btPreferences = new Button(toolbarComposite, SWT.PUSH);
        btPreferences.setImage(Activator.getImage("icons/settings2-icon.png"));
        btPreferences.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                showPreferences();
            }

        });

        // Button btCreate = new Button(filterComposite, SWT.PUSH);
        // btCreate.setImage(Activator.getImage("icons/open_icon.png"));
        // btCreate.addSelectionListener(new SelectionAdapter() {
        //
        // @Override
        // public void widgetSelected(SelectionEvent e) {
        // create();
        // }
        //
        // });

        viewerComposite = new Composite(composite, SWT.BORDER);
        GridData stackLayoutData = new GridData(GridData.FILL_BOTH);
        stackLayoutData.heightHint = 500;
        viewerComposite.setLayoutData(stackLayoutData);

        viewerStack = new StackLayout();
        viewerComposite.setLayout(viewerStack);

        createViewer();

        reload();

    }

    protected void showPreferences() {
        SnakeTablePreferences preferences = getPreferences();
        preferences.setTablePresenter(this);
        open(preferences);
    }

    public SnakeTablePreferences getPreferences() {

        SnakeTablePreferences preferences = new SnakeTablePreferences("lazyTable");

        try {

            preferences = new SnakeTablePreferences("lazyTable");
            preferences.getModelCoordinate().setDbId("lazyLogPrefs");

            SnakeList<SnakeTableColumnInfo> prefColumns = preferences.getColumns();

            for (ColumnInfo columnInfo : getVisibleColumns()) {
                SnakeTableColumnInfo newColumn = prefColumns.newElement();
                newColumn.setName("column");
                newColumn.setTitle(columnInfo.getTitle());
                newColumn.setPreferredWidth(columnInfo.getWidth());
                prefColumns.add(newColumn);
            }

        } catch (Exception e) {
            SnakeExceptionHandler.handle(e);
        }

        return preferences;
    }

    protected void savePreferences(SnakeTablePreferences preferences) {

        try {

            if (lazyList instanceof SnakeDaoLazyList) {

                determinePreferenceDbId(preferences);

                SnakeDaoLazyList daoList = (SnakeDaoLazyList) lazyList;
                SnakeDao dao = daoList.getDao();

                ISnakeDaoCrudResponse crudResponse = dao.create(preferences, 0);
                crudResponse.waitForResult(2000);
            }

        } catch (Exception e) {
            SnakeExceptionHandler.handle(e);
        }

    }

    private void determinePreferenceDbId(SnakeTablePreferences preferences) {
        SnakeModel example = lazyList.getExample();
        String dbId = example.getName() + "Preferences";

        preferences.getModelCoordinate().setDbId(dbId);
    }

    protected void loadPreferences(SnakeTablePreferences preferences) {

        try {

            if (lazyList instanceof SnakeDaoLazyList) {

                determinePreferenceDbId(preferences);

                SnakeDaoLazyList daoList = (SnakeDaoLazyList) lazyList;
                SnakeDao dao = daoList.getDao();

                ISnakeDaoCrudResponse crudResponse = dao.read(preferences, 0);
                crudResponse.waitForResult(2000);

                ISnakeModel resultModel = crudResponse.getModel();
                if (resultModel instanceof SnakeTablePreferences) {

                    for (ColumnInfo columnInfo : getAllColumns()) {
                        columnInfo.setVisible(false);
                    }

                    SnakeTablePreferences loadedPreferences = (SnakeTablePreferences) resultModel;
                    for (SnakeTableColumnInfo columnInfo : loadedPreferences.getColumns().all()) {
                        ColumnInfo column = findColumnByTitle(columnInfo.getTitle());
                        if (column != null) {
                            column.setVisible(true);
                            column.setWidth(columnInfo.getPreferredWidth());
                        }
                    }
                    preferences = loadedPreferences;

                    createViewer();
                    startSession();
                }
            }

        } catch (Exception e) {
            SnakeExceptionHandler.handle(e);
        }

    }

    private void stopDynamicTimer() {
        if (dynamicTimer != null) {
            dynamicTimer.cancel();
            dynamicTimer = null;
        }
        startSession();
    }

    protected void export() {

        final SnakeFile file = new SnakeFile("csv_export").set("D:/demo/EXPORT/export.csv");

        boolean allowOk = true;
        boolean needValidate = false;
        Shell shell = Display.getCurrent().getActiveShell();

        SnakeDialog snakeDialog = SnakeDialogRegistry.createForType(shell, file, allowOk, needValidate);

        if (snakeDialog.open() == Dialog.OK) {

            if (lazyList instanceof SnakeDaoLazyList) {
                try {
                    final SnakeDao<SnakeModel> dao = ((SnakeDaoLazyList) lazyList).getDao();

                    SnakeQuery<SnakeModel> query = (SnakeQuery) currentSession.getQuery().clone();
                    query.setModelCreator(lazyList.getModelCreator());

                    SnakeDaoExport<SnakeModel> exporter = new SnakeDaoExport<SnakeModel>();
                    exporter.csvExport(file, dao.getConnection(), query);

                } catch (Exception e) {
                    SnakeExceptionHandler.handle(e);
                }
            }

        }

    }

    private void createViewer() {

        if (viewer != null) {
            viewer.presenter = null;
            viewer.setInput(null);

            viewer.getControl().dispose();
        }

        viewer = new SnakeLazyTableViewer(this, viewerComposite, SWT.NONE);
        viewer.setInput(this);
        viewer.setItemCount(DYNAMIC_LOAD_START);

        GridData tableLayoutData = new GridData(GridData.FILL_BOTH);
        tableLayoutData.heightHint = 500;
        viewer.getTable().setLayoutData(tableLayoutData);

        for (int i = 0; i < getVisibleColumns().size(); i++) {
            final TableColumn tableColumn = viewer.getTable().getColumn(i);
            if (tableColumn != null) {
                final int index = i;

                ColumnInfo info = getVisibleColumns().get(i);
                if (info != null) {
                    tableColumn.setWidth(info.getWidth());
                }
            }
        }

        viewer.addDoubleClickListener(new IDoubleClickListener() {

            @Override
            public void doubleClick(DoubleClickEvent event) {

                ISelection selection = event.getSelection();
                if (selection instanceof IStructuredSelection) {
                    IStructuredSelection structuredSelection = (IStructuredSelection) selection;
                    Object selected = structuredSelection.getFirstElement();
                    if (selected instanceof SnakeType) {
                        SnakeType type = (SnakeType) selected;
                        open(type);
                    }

                }
            }
        });

        // use sortinig
        if (currentSorting != null) {

            String orderBy = currentSorting.getField();
            int columnIndex = getColumnIndexByTitle(orderBy);
            if (columnIndex >= 0) {

                Table table = viewer.getTable();
                TableColumn tableColumn = table.getColumn(columnIndex);

                int sortDirection = currentSorting.isAscending() ? SWT.UP : SWT.DOWN;
                table.setSortDirection(sortDirection);
                table.setSortColumn(tableColumn);

            }
        }

        viewer.getTable().getVerticalBar().addSelectionListener(new SelectionListener() {

            @Override
            public void widgetDefaultSelected(SelectionEvent e) {
            }

            @Override
            public void widgetSelected(SelectionEvent e) {
                if (e.detail == SWT.NONE) {
                    isDragging = false;
                    refresh(currentSession.getQuery());

                } else if (e.detail == SWT.DRAG) {
                    isDragging = true;
                }
            }

        });

        // viewer.getTable().addMouseListener(new MouseListener() {
        //
        // @Override
        // public void mouseUp(MouseEvent e) {
        // refreshVisibleItems(currentSession.getQuery());
        // }
        //
        // @Override
        // public void mouseDown(MouseEvent e) {
        //
        // }
        //
        // @Override
        // public void mouseDoubleClick(MouseEvent e) {
        //
        // }
        //
        // });
        viewer.getControl().addDisposeListener(new DisposeListener() {

            @Override
            public void widgetDisposed(DisposeEvent e) {
                try {
                    stopDynamicTimer();
                    lazyList.stopSession();
                } catch (IOException e1) {
                    SnakeExceptionHandler.handle(e1);
                }
            }
        });

        viewer.getControl().addControlListener(new ControlListener() {

            @Override
            public void controlResized(ControlEvent e) {
                pageSize = determineVisibileRowCount();
            }

            @Override
            public void controlMoved(ControlEvent e) {
            }
        });

        viewerStack.topControl = viewer.getTable();
        viewerComposite.layout();

        pageSize = determineVisibileRowCount();

    }

    private void refreshWithDisplay(final SnakeQuery query) {

        viewer.getControl().getDisplay().syncExec(new Runnable() {

            @Override
            public void run() {
                refresh(query);
            }

        });
    }

    private void refresh(final SnakeQuery query) {

        if (!viewer.getControl().isDisposed()) {
            int topIndex = viewer.getTable().getTopIndex();

            int lines = determineVisibileRowCount();
            query.setOffset(topIndex);
            query.setPageSize(lines);

            int totalCount = viewer.getTable().getItemCount();
            int end = topIndex + lines < totalCount ? topIndex + lines : totalCount;

            for (int i = topIndex; i < end; i++) {
                viewer.clear(i);
            }
            lazyList.cleanup(topIndex, lines);
            // lazyList.clear();
            try {
                lazyList.update(query);
            } catch (IOException e) {
                SnakeLog.log(e);
            }
        }
    }

    protected void open(SnakeType type) {

        boolean bValidate = false;
        boolean bOk = false;
        Dialog typeDialog = SnakeDialogRegistry.createForType(composite.getShell(), type, bOk, bValidate);
        if (typeDialog != null) {
            if (Dialog.OK == typeDialog.open()) {
            }
        }

    }

    @Override
    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        if (viewer instanceof SnakeLazyTableViewer) {
            ((SnakeLazyTableViewer) viewer).setItemCount(DYNAMIC_LOAD_START);
        }
    }

    @Override
    public void updateElement(int index) {
        SnakeModel model = lazyList.get(index);
        if (model != null) {
            if (!viewer.isBusy()) {
                viewer.replace(model, index);
            }
        } else {
            if (currentSession != null && !isDragging) {
                try {
                    SnakeQuery query = (SnakeQuery) currentSession.getQuery().clone();
                    if (query != null) {
                        if (query.getOffset() > index || index > query.getOffset() + query.getPageSize()) {
                            query.setOffset(index);
                            try {
                                lazyList.update(query);
                            } catch (IOException e) {
                            }
                        }
                    }
                } catch (CloneNotSupportedException e) {
                    SnakeLog.log(e);
                }
            }
        }

    }

    public void sort(TableColumn tableColumn) {

        boolean ascending = true;
        if (currentSorting == null) {
            currentSorting = new SnakeOrderBy("orderBy");
            currentSorting.setField(tableColumn.getText()).setAscending(ascending);
        } else {
            SnakeOrderBy orderInfo = currentSorting;
            if (orderInfo.getField().equals(tableColumn.getText())) {
                ascending = !orderInfo.isAscending();
                orderInfo.setAscending(ascending);
            } else {
                orderInfo.setField(tableColumn.getText());
                orderInfo.setAscending(ascending);
            }
        }

        Table table = viewer.getTable();
        int sortDirection = viewer.getTable().getSortDirection();
        sortDirection = ascending ? SWT.UP : SWT.DOWN;
        table.setSortDirection(sortDirection);
        table.setSortColumn(tableColumn);

        reload();
    }

    public void startSession() {

        SnakeTableDataSession session = new SnakeTableDataSession();

        if (currentSorting != null) {
            SnakeOrderBy orderBy = currentSorting;
            session.addOrderBy(orderBy.getField(), orderBy.isAscending());
        }

        List<SnakeTableColumnInfo> neededColumns = neededColumns();
        session.setRequestedColumns(neededColumns);

        session.setSessionId(++sessionId);

        SnakeQuery query = new SnakeQuery();
        query.getSearch().setFullText(search.getFullText());
        for (SnakeTableColumnInfo column : session.getRequestedColumns()) {
            query.addRequestedField(column.getTitle());
        }

        try {

            for (SnakeOrderBy orderBy : session.getSortInfo()) {
                query.getSortingList().add((SnakeOrderBy) orderBy.clone());
            }
            query.setExample(lazyList.getExample());
            query.setPageSize(pageSize);

            session.setQuery(query);
            this.currentSession = session;

            lazyList.startSession(query);

        } catch (Exception e) {
            SnakeExceptionHandler.handle(e);
        }
    }

    public void reload() {
        if (viewer != null && !viewer.getControl().isDisposed()) {
            viewer.getControl().getDisplay().syncExec(new Runnable() {

                @Override
                public void run() {
                    viewer.setItemCount(1);
                    viewer.getTable().clearAll();
                    viewer.refresh();
                }
            });
        }
        startSession();
    }

    public class SelectColumnsDialog extends Dialog {

        List<String> visible = new ArrayList<String>();
        List<String> hidden = new ArrayList<String>();

        protected SelectColumnsDialog(Shell parentShell) {
            super(parentShell);
        }

        @Override
        protected Control createDialogArea(Composite parent) {

            Composite composite = new Composite(parent, SWT.NONE);
            composite.setLayout(new GridLayout(3, false));

            for (ColumnInfo column : getVisibleColumns()) {
                visible.add(column.getTitle());
            }

            for (ColumnInfo column : getHiddenColumns()) {
                hidden.add(column.getTitle());
            }

            final org.eclipse.swt.widgets.List hiddenList = new org.eclipse.swt.widgets.List(composite,
                    SWT.BORDER | SWT.MULTI);
            for (String column : hidden) {
                hiddenList.add(column);
            }
            hiddenList.setToolTipText("hidden columns");
            GridData gridData = new GridData(GridData.FILL_BOTH);
            gridData.heightHint = 400;
            gridData.widthHint = 300;
            hiddenList.setLayoutData(gridData);

            Composite buttonComposite = new Composite(composite, SWT.BORDER);
            buttonComposite.setLayoutData(new GridData(GridData.FILL_VERTICAL));
            buttonComposite.setLayout(new GridLayout());

            final org.eclipse.swt.widgets.List visibleList = new org.eclipse.swt.widgets.List(composite,
                    SWT.BORDER | SWT.MULTI);
            for (String column : visible) {
                visibleList.add(column);
            }
            visibleList.setToolTipText("visible columns");
            visibleList.setLayoutData(gridData);

            Button addButton = new Button(buttonComposite, SWT.PUSH);
            String path = "icons/next.png";
            Image image = Activator.getImage(path);
            addButton.setImage(image);
            addButton.addSelectionListener(new SelectionAdapter() {

                @Override
                public void widgetSelected(SelectionEvent e) {

                    String[] toAdd = hiddenList.getSelection();
                    if (toAdd != null && toAdd.length > 0) {
                        for (String addStr : toAdd) {
                            hiddenList.remove(addStr);
                            hidden.remove(addStr);

                            visibleList.add(addStr);
                            visible.add(addStr);
                        }
                    }

                }
            });

            Button removeButton = new Button(buttonComposite, SWT.PUSH);
            path = "icons/prev.png";
            image = Activator.getImage(path);
            removeButton.setImage(image);
            removeButton.addSelectionListener(new SelectionAdapter() {

                @Override
                public void widgetSelected(SelectionEvent e) {
                    String[] toRemove = visibleList.getSelection();
                    if (toRemove != null && toRemove.length > 0) {
                        for (String removeStr : toRemove) {
                            visibleList.remove(removeStr);
                            visible.remove(removeStr);

                            hiddenList.add(removeStr);
                            hidden.add(removeStr);
                        }
                    }

                }
            });

            return composite;
        }

        List<String> getSelectedColumns() {
            return visible;
        }
    }

    public void selectColumns() {

        SelectColumnsDialog selectDialog = new SelectColumnsDialog(viewer.getControl().getShell());
        if (selectDialog.open() == Dialog.OK) {

            for (ColumnInfo columnInfo : allColumns) {
                columnInfo.setVisible(false);
            }

            for (String visible : selectDialog.getSelectedColumns()) {
                ColumnInfo showColumn = findColumnByTitle(visible);
                if (showColumn != null) {
                    showColumn.setVisible(true);
                }
            }

        }

        createViewer();
        startSession();
    }

    public void clearPreferences() {

        for (ColumnInfo columnInfo : allColumns) {
            columnInfo.setVisible(true);
        }

        currentSorting = null;
    }

    @Override
    public void update(ISnakeModification imodification) {
        reload();
    }

    @Override
    public void dispose() {
        // TODO Auto-generated method stub

    }

    public int indexOf(SnakeModel model) {
        return lazyList.indexOf(model);
    }

    public void columnChanged(String title, int width) {
        for (ColumnInfo columnInfo : getVisibleColumns()) {
            if (columnInfo.title.equals(title)) {
                columnInfo.setWidth(width);
                break;
            }
        }
    }

    private void handleDynamic() {
        dynamicTimer = new Timer();
        dynamicTimer.schedule(new TimerTask() {

            @Override
            public void run() {
                try {
                    SnakeQuery<SnakeModel> query = currentSession.getQuery();
                    if (query == null) {
                        throw new SnakeNotInitializedException("no query available");
                    }

                    // List<ISnakeOrderBy> sortingList = query.getSortBy();
                    // if (sortingList != null && sortingList.size() > 0) {
                    // ISnakeOrderBy orderBy = sortingList.get(0);
                    // orderBy.setAscending(!orderBy.isAscending());
                    // }

                    // reload();
                    refreshWithDisplay(query);
                } catch (Exception e) {
                    stopDynamicTimer();
                    SnakeExceptionHandler.handle(e);
                }
            }
        }, 1000, 1000);
    }

    private int determineVisibileRowCount() {
        Point size = viewer.getTable().getSize();
        int lines = size.y / viewer.getTable().getItemHeight();
        return lines;
    }
}