net.tourbook.ui.views.tourMarker.TourMarkerView.java Source code

Java tutorial

Introduction

Here is the source code for net.tourbook.ui.views.tourMarker.TourMarkerView.java

Source

/*******************************************************************************
 * Copyright (C) 2005, 2015 Wolfgang Schramm and Contributors
 * 
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation version 2 of the License.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
 *******************************************************************************/
package net.tourbook.ui.views.tourMarker;

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

import net.tourbook.Messages;
import net.tourbook.application.TourbookPlugin;
import net.tourbook.common.UI;
import net.tourbook.common.util.ColumnDefinition;
import net.tourbook.common.util.ColumnManager;
import net.tourbook.common.util.ITourViewer;
import net.tourbook.common.util.PostSelectionProvider;
import net.tourbook.data.TourData;
import net.tourbook.data.TourMarker;
import net.tourbook.database.TourDatabase;
import net.tourbook.preferences.ITourbookPreferences;
import net.tourbook.tour.ActionOpenMarkerDialog;
import net.tourbook.tour.ITourEventListener;
import net.tourbook.tour.SelectionDeletedTours;
import net.tourbook.tour.SelectionTourData;
import net.tourbook.tour.SelectionTourId;
import net.tourbook.tour.SelectionTourIds;
import net.tourbook.tour.SelectionTourMarker;
import net.tourbook.tour.TourEvent;
import net.tourbook.tour.TourEventId;
import net.tourbook.tour.TourManager;
import net.tourbook.ui.ITourProvider;
import net.tourbook.ui.TableColumnFactory;
import net.tourbook.ui.action.ActionModifyColumns;
import net.tourbook.ui.tourChart.ChartLabel;
import net.tourbook.ui.views.tourCatalog.SelectionTourCatalogView;
import net.tourbook.ui.views.tourCatalog.TVICatalogComparedTour;
import net.tourbook.ui.views.tourCatalog.TVICatalogRefTourItem;
import net.tourbook.ui.views.tourCatalog.TVICompareResultComparedTour;

import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.layout.PixelConverter;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerRow;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IPartListener2;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.part.PageBook;
import org.eclipse.ui.part.ViewPart;

public class TourMarkerView extends ViewPart implements ITourProvider, ITourViewer {

    public static final String ID = "net.tourbook.views.TourMarkerView"; //$NON-NLS-1$

    private final IPreferenceStore _prefStore = TourbookPlugin.getPrefStore();
    private final IDialogSettings _state = TourbookPlugin.getState("TourMarkerView"); //$NON-NLS-1$

    private TourData _tourData;

    private PostSelectionProvider _postSelectionProvider;
    private ISelectionListener _postSelectionListener;
    private IPropertyChangeListener _prefChangeListener;
    private ITourEventListener _tourEventListener;
    private IPartListener2 _partListener;

    private ActionOpenMarkerDialog _actionEditTourMarkers;
    private ActionModifyColumns _actionModifyColumns;

    private PixelConverter _pc;

    private TableViewer _markerViewer;
    private ColumnManager _columnManager;

    private boolean _isInUpdate;
    private boolean _isMultipleTours;

    private ColumnDefinition _colDefName;
    private ColumnDefinition _colDefVisibility;

    private final NumberFormat _nf3 = NumberFormat.getNumberInstance();
    {
        _nf3.setMinimumFractionDigits(3);
        _nf3.setMaximumFractionDigits(3);
    }

    /*
     * UI controls
     */
    private PageBook _pageBook;
    private Composite _pageNoData;
    private Composite _viewerContainer;

    private Font _boldFont;

    class MarkerViewerContentProvicer implements IStructuredContentProvider {

        @Override
        public void dispose() {
        }

        @Override
        public Object[] getElements(final Object inputElement) {

            if (_tourData == null) {
                return new Object[0];
            } else {

                Object[] tourMarkers;

                if (_tourData.isMultipleTours()) {

                    tourMarkers = _tourData.multiTourMarkers.toArray();

                } else {

                    tourMarkers = _tourData.getTourMarkers().toArray();
                }

                //            System.out.println((UI.timeStampNano() + " [" + getClass().getSimpleName() + "] ")
                //                  + ("\n\t_tourData: " + _tourData));
                //            // TODO remove SYSTEM.OUT.PRINTLN

                return tourMarkers;
            }
        }

        @Override
        public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) {
        }
    }

    /**
     * Sort the markers by time
     */
    private class MarkerViewerSorter extends ViewerSorter {

        @Override
        public int compare(final Viewer viewer, final Object obj1, final Object obj2) {

            //         return ((TourMarker) (obj1)).getTime() - ((TourMarker) (obj2)).getTime();
            // time is disabled because it's not always available in gpx files

            if (_isMultipleTours) {

                return ((TourMarker) (obj1)).getMultiTourSerieIndex()
                        - ((TourMarker) (obj2)).getMultiTourSerieIndex();
            } else {

                return ((TourMarker) (obj1)).getSerieIndex() - ((TourMarker) (obj2)).getSerieIndex();
            }

        }
    }

    public TourMarkerView() {
        super();
    }

    private void addPartListener() {

        _partListener = new IPartListener2() {

            @Override
            public void partActivated(final IWorkbenchPartReference partRef) {
            }

            @Override
            public void partBroughtToTop(final IWorkbenchPartReference partRef) {
            }

            @Override
            public void partClosed(final IWorkbenchPartReference partRef) {
                if (partRef.getPart(false) == TourMarkerView.this) {

                    //               TourManager.fireEvent(TourEventId.CLEAR_DISPLAYED_TOUR, null, TourMarkerView.this);
                    saveState();
                }
            }

            @Override
            public void partDeactivated(final IWorkbenchPartReference partRef) {
            }

            @Override
            public void partHidden(final IWorkbenchPartReference partRef) {
            }

            @Override
            public void partInputChanged(final IWorkbenchPartReference partRef) {
            }

            @Override
            public void partOpened(final IWorkbenchPartReference partRef) {
            }

            @Override
            public void partVisible(final IWorkbenchPartReference partRef) {
            }
        };
        getViewSite().getPage().addPartListener(_partListener);
    }

    private void addPrefListener() {

        _prefChangeListener = new IPropertyChangeListener() {
            @Override
            public void propertyChange(final PropertyChangeEvent event) {

                final String property = event.getProperty();

                if (property.equals(ITourbookPreferences.MEASUREMENT_SYSTEM)) {

                    // measurement system has changed

                    _columnManager.saveState(_state);
                    _columnManager.clearColumns();

                    defineAllColumns();

                    _markerViewer = (TableViewer) recreateViewer(_markerViewer);

                } else if (property.equals(ITourbookPreferences.VIEW_LAYOUT_CHANGED)) {

                    _markerViewer.getTable()
                            .setLinesVisible(_prefStore.getBoolean(ITourbookPreferences.VIEW_LAYOUT_DISPLAY_LINES));

                    _markerViewer.refresh();

                    /*
                     * the tree must be redrawn because the styled text does not show with the new
                     * color
                     */
                    _markerViewer.getTable().redraw();

                }
            }
        };
        _prefStore.addPropertyChangeListener(_prefChangeListener);
    }

    /**
     * listen for events when a tour is selected
     */
    private void addSelectionListener() {

        _postSelectionListener = new ISelectionListener() {

            @Override
            public void selectionChanged(final IWorkbenchPart part, final ISelection selection) {

                if (part == TourMarkerView.this) {
                    return;
                }

                onSelectionChanged(selection);
            }
        };
        getSite().getPage().addPostSelectionListener(_postSelectionListener);
    }

    private void addTourEventListener() {

        _tourEventListener = new ITourEventListener() {
            @Override
            public void tourChanged(final IWorkbenchPart part, final TourEventId eventId, final Object eventData) {

                if (_isInUpdate || part == TourMarkerView.this) {
                    return;
                }

                if (eventId == TourEventId.TOUR_SELECTION && eventData instanceof ISelection) {

                    onSelectionChanged((ISelection) eventData);

                } else {

                    if (_tourData == null) {
                        return;
                    }

                    if ((eventId == TourEventId.TOUR_CHANGED) && (eventData instanceof TourEvent)) {

                        final ArrayList<TourData> modifiedTours = ((TourEvent) eventData).getModifiedTours();
                        if (modifiedTours != null) {

                            // update modified tour

                            final long viewTourId = _tourData.getTourId();

                            for (final TourData tourData : modifiedTours) {
                                if (tourData.getTourId() == viewTourId) {

                                    // get modified tour
                                    _tourData = tourData;
                                    _isMultipleTours = tourData.isMultipleTours();

                                    updateUI_MarkerViewer();

                                    // removed old tour data from the selection provider
                                    _postSelectionProvider.clearSelection();

                                    // nothing more to do, the view contains only one tour
                                    return;
                                }
                            }
                        }

                    } else if (eventId == TourEventId.MARKER_SELECTION) {

                        onTourEvent_TourMarker(eventData);

                    } else if (eventId == TourEventId.CLEAR_DISPLAYED_TOUR) {

                        clearView();
                    }
                }
            }
        };

        TourManager.getInstance().addTourEventListener(_tourEventListener);
    }

    private void clearView() {

        _tourData = null;

        updateUI_MarkerViewer();

        _postSelectionProvider.clearSelection();
    }

    private void createActions() {

        _actionEditTourMarkers = new ActionOpenMarkerDialog(this, true);
        _actionModifyColumns = new ActionModifyColumns(this);
    }

    @Override
    public void createPartControl(final Composite parent) {

        _pc = new PixelConverter(parent);
        _boldFont = JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT);

        // define all columns for the viewer
        _columnManager = new ColumnManager(this, _state);
        _columnManager.setIsCategoryAvailable(true);
        defineAllColumns();

        createUI(parent);

        addSelectionListener();
        addTourEventListener();
        addPrefListener();
        addPartListener();

        createActions();
        fillToolbar();

        // this part is a selection provider
        getSite().setSelectionProvider(_postSelectionProvider = new PostSelectionProvider(ID));

        // show default page
        _pageBook.showPage(_pageNoData);

        // show marker from last selection
        onSelectionChanged(getSite().getWorkbenchWindow().getSelectionService().getSelection());

        if (_tourData == null) {
            showTourFromTourProvider();
        }
    }

    private void createUI(final Composite parent) {

        _pageBook = new PageBook(parent, SWT.NONE);
        GridDataFactory.fillDefaults().grab(true, true).applyTo(_pageBook);

        _pageNoData = net.tourbook.common.UI.createUI_PageNoData(_pageBook, Messages.UI_Label_no_chart_is_selected);

        _viewerContainer = new Composite(_pageBook, SWT.NONE);
        GridLayoutFactory.fillDefaults().applyTo(_viewerContainer);
        {
            createUI_10_TableViewer(_viewerContainer);
        }
    }

    private void createUI_10_TableViewer(final Composite parent) {

        /*
         * create table
         */
        final Table table = new Table(parent, SWT.FULL_SELECTION | SWT.MULTI /* | SWT.BORDER */);
        GridDataFactory.fillDefaults().grab(true, true).applyTo(table);

        table.setHeaderVisible(true);
        //      table.setLinesVisible(_prefStore.getBoolean(ITourbookPreferences.VIEW_LAYOUT_DISPLAY_LINES));
        table.setLinesVisible(false);

        /*
         * create table viewer
         */
        _markerViewer = new TableViewer(table);

        //      // set editing support after the viewer is created but before the columns are created
        //      net.tourbook.common.UI.setCellEditSupport(_markerViewer);
        //
        //      _colDefName.setEditingSupport(new MarkerEditingSupportLabel(_markerViewer));
        //      _colDefVisibility.setEditingSupport(new MarkerEditingSupportVisibility(_markerViewer));

        _columnManager.createColumns(_markerViewer);

        _markerViewer.setUseHashlookup(true);
        _markerViewer.setContentProvider(new MarkerViewerContentProvicer());
        _markerViewer.setSorter(new MarkerViewerSorter());

        _markerViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(final SelectionChangedEvent event) {
                onSelect_TourMarker((StructuredSelection) event.getSelection());
            }
        });

        _markerViewer.addDoubleClickListener(new IDoubleClickListener() {
            @Override
            public void doubleClick(final DoubleClickEvent event) {

                if (isTourSavedInDb() == false) {
                    return;
                }

                // edit selected marker
                final IStructuredSelection selection = (IStructuredSelection) _markerViewer.getSelection();
                if (selection.size() > 0) {
                    _actionEditTourMarkers.setTourMarker((TourMarker) selection.getFirstElement());
                    _actionEditTourMarkers.run();
                }
            }
        });

        createUI_20_ContextMenu();
    }

    /**
     * create the views context menu
     */
    private void createUI_20_ContextMenu() {

        final MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
        menuMgr.setRemoveAllWhenShown(true);
        menuMgr.addMenuListener(new IMenuListener() {
            @Override
            public void menuAboutToShow(final IMenuManager manager) {
                fillContextMenu(manager);
            }
        });

        final Table table = (Table) _markerViewer.getControl();
        final Menu tableContextMenu = menuMgr.createContextMenu(table);

        _columnManager.createHeaderContextMenu(table, tableContextMenu);
    }

    private void defineAllColumns() {

        defineColumn_Marker_IsVisible();

        defineColumn_Time_Time();
        defineColumn_Time_TimeDelta();

        defineColumn_Motion_Distance();
        defineColumn_Motion_DistanceDelta();

        defineColumn_Waypoint_Name();
        defineColumn_Waypoint_Description();
        defineColumn_Marker_Url();

        defineColumn_Data_SerieIndex();
    }

    /**
     * Column: Serie index
     */
    private void defineColumn_Data_SerieIndex() {

        _colDefName = TableColumnFactory.MARKER_SERIE_INDEX.createColumn(_columnManager, _pc);

        _colDefName.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {

                final TourMarker marker = (TourMarker) cell.getElement();

                cell.setText(Integer.toString(marker.getSerieIndex()));
            }
        });
    }

    /**
     * Column: Is visible
     */
    private void defineColumn_Marker_IsVisible() {

        _colDefVisibility = TableColumnFactory.MARKER_MAP_VISIBLE.createColumn(_columnManager, _pc);

        _colDefVisibility.setIsDefaultColumn();

        _colDefVisibility.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {

                final TourMarker tourMarker = (TourMarker) cell.getElement();
                cell.setText(tourMarker.isMarkerVisible() ? Messages.App_Label_BooleanYes
                        : Messages.App_Label_BooleanNo);
            }
        });
    }

    /**
     * Column: Url
     */
    private void defineColumn_Marker_Url() {

        final ColumnDefinition colDef = TableColumnFactory.MARKER_URL.createColumn(_columnManager, _pc);

        colDef.setIsDefaultColumn();

        colDef.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {

                final TourMarker marker = (TourMarker) cell.getElement();

                String columnText = UI.EMPTY_STRING;

                /*
                 * Url
                 */
                final String urlText = marker.getUrlText();
                final String urlAddress = marker.getUrlAddress();
                final boolean isText = urlText.length() > 0;
                final boolean isAddress = urlAddress.length() > 0;

                if (isText || isAddress) {

                    if (isAddress == false) {

                        // only text is in the link -> this is not a internet address but create a link of it

                        columnText = urlText;

                    } else {

                        columnText = urlAddress;
                    }
                }

                cell.setText(columnText);
            }
        });
    }

    /**
     * Column: Distance km/mi
     */
    private void defineColumn_Motion_Distance() {

        final ColumnDefinition colDef = TableColumnFactory.MOTION_DISTANCE.createColumn(_columnManager, _pc);

        colDef.setIsDefaultColumn();
        colDef.disableValueFormatter();

        colDef.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {

                final TourMarker tourMarker = (TourMarker) cell.getElement();

                final float markerDistance = tourMarker.getDistance();
                if (markerDistance == -1) {
                    cell.setText(UI.EMPTY_STRING);
                } else {
                    cell.setText(_nf3.format(markerDistance / 1000 / net.tourbook.ui.UI.UNIT_VALUE_DISTANCE));
                }

                if (tourMarker.getType() == ChartLabel.MARKER_TYPE_DEVICE) {
                    cell.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
                }
            }
        });
    }

    /**
     * Column: Distance delta km/mi
     */
    private void defineColumn_Motion_DistanceDelta() {

        final ColumnDefinition colDef = TableColumnFactory.MOTION_DISTANCE_DELTA.createColumn(_columnManager, _pc);

        colDef.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {

                final TourMarker tourMarker = (TourMarker) cell.getElement();

                final float markerDistance = tourMarker.getDistance();

                if (markerDistance == -1) {

                    cell.setText(UI.EMPTY_STRING);

                } else {

                    float prevDistance = 0;
                    final ViewerRow lastRow = cell.getViewerRow().getNeighbor(ViewerRow.ABOVE, false);

                    if (null != lastRow) {
                        final TourMarker element = (TourMarker) lastRow.getElement();
                        if (element instanceof TourMarker) {
                            prevDistance = element.getDistance();
                        }
                        prevDistance = prevDistance < 0 ? 0 : prevDistance;
                    }

                    cell.setText(_nf3.format(
                            (markerDistance - prevDistance) / 1000 / net.tourbook.ui.UI.UNIT_VALUE_DISTANCE));
                }
            }
        });
    }

    /**
     * Column: Time
     */
    private void defineColumn_Time_Time() {

        final ColumnDefinition colDef = TableColumnFactory.TIME_TOUR_TIME_HH_MM_SS.createColumn(_columnManager,
                _pc);

        colDef.setIsDefaultColumn();

        // hide wrong tooltip
        colDef.setColumnHeaderToolTipText(UI.EMPTY_STRING);

        colDef.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {

                final TourMarker marker = (TourMarker) cell.getElement();
                final long time = marker.getTime();

                cell.setText(net.tourbook.common.UI.format_hh_mm_ss(time));
            }
        });
    }

    /**
     * Column: Time
     */
    private void defineColumn_Time_TimeDelta() {

        final ColumnDefinition colDef = TableColumnFactory.MARKER_TIME_DELTA.createColumn(_columnManager, _pc);

        colDef.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {

                final ViewerRow lastRow = cell.getViewerRow().getNeighbor(ViewerRow.ABOVE, false);
                int lastTime = 0;
                if (null != lastRow) {
                    final Object element = lastRow.getElement();
                    if (element instanceof TourMarker) {
                        lastTime = ((TourMarker) element).getTime();
                    }
                }

                cell.setText(net.tourbook.common.UI
                        .format_hh_mm_ss(((TourMarker) cell.getElement()).getTime() - lastTime));

                final String text = ((TourMarker) cell.getElement()).getLabel();

                /*
                 * Show text in red/bold when the text ends with a !, this hidden feature was
                 * introduced by helmling
                 */
                if (text.endsWith(UI.SYMBOL_EXCLAMATION_POINT)) {

                    final Display display = Display.getCurrent();

                    if (null != display) {
                        cell.setForeground(display.getSystemColor(SWT.COLOR_RED));
                    }

                    cell.setFont(_boldFont);
                }
            }
        });
    }

    /**
     * Column: Description
     */
    private void defineColumn_Waypoint_Description() {

        final ColumnDefinition colDef = TableColumnFactory.WAYPOINT_DESCRIPTION.createColumn(_columnManager, _pc);

        colDef.setIsDefaultColumn();

        colDef.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {

                final TourMarker marker = (TourMarker) cell.getElement();
                cell.setText(marker.getDescription());
            }
        });
    }

    /**
     * Column: Name
     */
    private void defineColumn_Waypoint_Name() {

        _colDefName = TableColumnFactory.WAYPOINT_NAME.createColumn(_columnManager, _pc);

        _colDefName.setIsDefaultColumn();

        _colDefName.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {

                final TourMarker marker = (TourMarker) cell.getElement();

                cell.setText(marker.getLabel());
            }
        });
    }

    @Override
    public void dispose() {

        TourManager.getInstance().removeTourEventListener(_tourEventListener);

        getSite().getPage().removePostSelectionListener(_postSelectionListener);
        getViewSite().getPage().removePartListener(_partListener);

        _prefStore.removePropertyChangeListener(_prefChangeListener);

        super.dispose();
    }

    /**
     * enable actions
     */
    private void enableActions() {

        final boolean isTourInDb = isTourSavedInDb();
        final boolean isSingleTour = _tourData != null && _tourData.isMultipleTours() == false;

        _actionEditTourMarkers.setEnabled(isTourInDb && isSingleTour);
    }

    private void fillContextMenu(final IMenuManager menuMgr) {

        menuMgr.add(_actionEditTourMarkers);

        // add standard group which allows other plug-ins to contribute here
        menuMgr.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));

        // set the marker which should be selected in the marker dialog
        final IStructuredSelection selection = (IStructuredSelection) _markerViewer.getSelection();
        _actionEditTourMarkers.setTourMarker((TourMarker) selection.getFirstElement());

        enableActions();
    }

    private void fillToolbar() {

        final IActionBars actionBars = getViewSite().getActionBars();

        /*
         * Fill view menu
         */
        final IMenuManager menuMgr = actionBars.getMenuManager();

        menuMgr.add(new Separator());
        menuMgr.add(_actionModifyColumns);

        /*
         * Fill view toolbar
         */
        //      final IToolBarManager tbm = actionBars.getToolBarManager();
        //
        //      tbm.add();
    }

    @Override
    public ColumnManager getColumnManager() {
        return _columnManager;
    }

    public Object getMarkerViewer() {
        return _markerViewer;
    }

    @Override
    public ArrayList<TourData> getSelectedTours() {

        final ArrayList<TourData> selectedTours = new ArrayList<TourData>();

        if (_tourData != null) {
            selectedTours.add(_tourData);
        }

        return selectedTours;
    }

    @Override
    public ColumnViewer getViewer() {
        return _markerViewer;
    }

    /**
     * @return Returns <code>true</code> when the tour is saved in the database.
     */
    private boolean isTourSavedInDb() {

        if ((_tourData != null) && (_tourData.getTourPerson() != null)) {
            return true;
        }

        return false;
    }

    private void onSelect_TourMarker(final StructuredSelection selection) {

        if (_isInUpdate) {
            return;
        }

        final ArrayList<TourMarker> selectedTourMarker = new ArrayList<TourMarker>();

        for (final Iterator<?> iterator = selection.iterator(); iterator.hasNext();) {
            selectedTourMarker.add((TourMarker) iterator.next());
        }

        TourManager.fireEventWithCustomData(//
                TourEventId.MARKER_SELECTION, new SelectionTourMarker(_tourData, selectedTourMarker),
                getSite().getPart());
    }

    private void onSelectionChanged(final ISelection selection) {

        if (_isInUpdate || selection == null) {
            return;
        }

        //      System.out.println((net.tourbook.common.UI.timeStampNano() + " [" + getClass().getSimpleName() + "] ")
        //            + ("\tonSelectionChanged: " + selection));
        //      // TODO remove SYSTEM.OUT.PRINTLN

        long tourId = TourDatabase.ENTITY_IS_NOT_SAVED;
        TourData tourData = null;

        if (selection instanceof SelectionTourData) {

            // a tour was selected, get the chart and update the marker viewer

            final SelectionTourData tourDataSelection = (SelectionTourData) selection;
            tourData = tourDataSelection.getTourData();

        } else if (selection instanceof SelectionTourId) {

            tourId = ((SelectionTourId) selection).getTourId();

        } else if (selection instanceof SelectionTourIds) {

            final ArrayList<Long> tourIds = ((SelectionTourIds) selection).getTourIds();

            if (tourIds != null && tourIds.size() > 0) {

                if (tourIds.size() == 1) {
                    tourId = tourIds.get(0);
                } else {
                    tourData = TourManager.createMultipleTourData(tourIds);
                }
            }

        } else if (selection instanceof SelectionTourCatalogView) {

            final SelectionTourCatalogView tourCatalogSelection = (SelectionTourCatalogView) selection;

            final TVICatalogRefTourItem refItem = tourCatalogSelection.getRefItem();
            if (refItem != null) {
                tourId = refItem.getTourId();
            }

        } else if (selection instanceof StructuredSelection) {

            final Object firstElement = ((StructuredSelection) selection).getFirstElement();
            if (firstElement instanceof TVICatalogComparedTour) {
                tourId = ((TVICatalogComparedTour) firstElement).getTourId();
            } else if (firstElement instanceof TVICompareResultComparedTour) {
                tourId = ((TVICompareResultComparedTour) firstElement).getComparedTourData().getTourId();
            }

        } else if (selection instanceof SelectionDeletedTours) {

            clearView();
        }

        if (tourData == null) {

            if (tourId >= TourDatabase.ENTITY_IS_NOT_SAVED) {

                tourData = TourManager.getInstance().getTourData(tourId);
                if (tourData != null) {
                    _tourData = tourData;
                    _isMultipleTours = tourData.isMultipleTours();
                }
            }
        } else {

            _tourData = tourData;
            _isMultipleTours = tourData.isMultipleTours();
        }

        updateUI_MarkerViewer();
    }

    private void onTourEvent_TourMarker(final Object eventData) {

        if (eventData instanceof SelectionTourMarker) {

            /*
             * Select the tourmarker in the view
             */
            final SelectionTourMarker selection = (SelectionTourMarker) eventData;

            final TourData tourData = selection.getTourData();
            final ArrayList<TourMarker> tourMarker = selection.getSelectedTourMarker();

            if (tourData != _tourData) {

                _tourData = tourData;
                _isMultipleTours = tourData.isMultipleTours();

                updateUI_MarkerViewer();
            }

            _isInUpdate = true;
            {
                _markerViewer.setSelection(new StructuredSelection(tourMarker), true);
            }
            _isInUpdate = false;
        }
    }

    @Override
    public ColumnViewer recreateViewer(final ColumnViewer columnViewer) {

        _viewerContainer.setRedraw(false);
        {
            _markerViewer.getTable().dispose();

            createUI_10_TableViewer(_viewerContainer);
            _viewerContainer.layout();

            // update the viewer
            reloadViewer();
        }
        _viewerContainer.setRedraw(true);

        return _markerViewer;
    }

    @Override
    public void reloadViewer() {

        updateUI_MarkerViewer();
    }

    private void saveState() {

        _columnManager.saveState(_state);
    }

    @Override
    public void setFocus() {

        _markerViewer.getTable().setFocus();
    }

    private void showTourFromTourProvider() {

        _pageBook.showPage(_pageNoData);

        // a tour is not displayed, find a tour provider which provides a tour
        Display.getCurrent().asyncExec(new Runnable() {
            @Override
            public void run() {

                // validate widget
                if (_pageBook.isDisposed()) {
                    return;
                }

                /*
                 * check if tour was set from a selection provider
                 */
                if (_tourData != null) {
                    return;
                }

                onSelectionChanged(TourManager.getSelectedToursSelection());
            }
        });
    }

    @Override
    public void updateColumnHeader(final ColumnDefinition colDef) {
        // TODO Auto-generated method stub

    }

    private void updateUI_MarkerViewer() {

        if (_tourData == null) {

            _pageBook.showPage(_pageNoData);

        } else {

            _isInUpdate = true;
            {
                _markerViewer.setInput(new Object[0]);
            }
            _isInUpdate = false;

            _pageBook.showPage(_viewerContainer);
        }

        enableActions();
    }
}