Java tutorial
/******************************************************************************* * 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; } }