net.tourbook.ui.views.TourWaypointView.java Source code

Java tutorial

Introduction

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

Source

/*******************************************************************************
 * Copyright (C) 2005, 2016 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;

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

import net.tourbook.Messages;
import net.tourbook.application.TourbookPlugin;
import net.tourbook.common.time.TimeTools;
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.TourWayPoint;
import net.tourbook.database.TourDatabase;
import net.tourbook.preferences.ITourbookPreferences;
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.TourEventId;
import net.tourbook.tour.TourManager;
import net.tourbook.ui.ITourProvider;
import net.tourbook.ui.TableColumnFactory;
import net.tourbook.ui.UI;
import net.tourbook.ui.action.ActionModifyColumns;
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.GridLayoutFactory;
import org.eclipse.jface.layout.PixelConverter;
import org.eclipse.jface.preference.IPreferenceStore;
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.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.IPartListener2;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.part.PageBook;
import org.eclipse.ui.part.ViewPart;

public class TourWaypointView extends ViewPart implements ITourProvider, ITourViewer {

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

    public static final int COLUMN_TIME = 0;

    public static final int COLUMN_DISTANCE = 1;
    public static final int COLUMN_REMARK = 2;
    public static final int COLUMN_VISUAL_POSITION = 3;
    public static final int COLUMN_X_OFFSET = 4;
    public static final int COLUMN_Y_OFFSET = 5;

    private final IPreferenceStore _prefStore = TourbookPlugin.getDefault().getPreferenceStore();
    private final IDialogSettings _state = TourbookPlugin.getDefault().getDialogSettingsSection(ID);

    private TourData _tourData;

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

    private PixelConverter _pc;

    /*
     * UI controls
     */
    private PageBook _pageBook;

    private TableViewer _wpViewer;

    private Composite _pageNoData;
    private Composite _viewerContainer;

    private ActionModifyColumns _actionModifyColumns;

    /*
     * none UI
     */
    private ColumnManager _columnManager;

    /*
     * measurement unit values
     */
    private float _unitValueAltitude;

    private final NumberFormat _nf_1_1 = NumberFormat.getNumberInstance();

    {
        _nf_1_1.setMinimumFractionDigits(1);
        _nf_1_1.setMaximumFractionDigits(1);
    }

    private static class WayPointComparator extends ViewerComparator {

        @Override
        public int compare(final Viewer viewer, final Object e1, final Object e2) {

            final TourWayPoint wp1 = (TourWayPoint) e1;
            final TourWayPoint wp2 = (TourWayPoint) e2;

            /*
             * sort by time
             */
            final long wp1Time = wp1.getTime();
            final long wp2Time = wp2.getTime();

            if (wp1Time != 0 && wp2Time != 0) {
                return wp1Time > wp2Time ? 1 : -1;
            }

            return wp1Time != 0 ? 1 : -1;

            //         /*
            //          * sort by creation sequence
            //          */
            //         final long wp1CreateId = wp1.getCreateId();
            //         final long wp2CreateId = wp2.getCreateId();
            //
            //         if (wp1CreateId == 0) {
            //
            //            if (wp2CreateId == 0) {
            //
            //               // both way points are persisted
            //               return wp1.getWayPointId() > wp2.getWayPointId() ? 1 : -1;
            //            }
            //
            //            return 1;
            //
            //         } else {
            //
            //            // _createId != 0
            //
            //            if (wp2CreateId != 0) {
            //
            //               // both way points are created and not persisted
            //               return wp1CreateId > wp2CreateId ? 1 : -1;
            //            }
            //
            //            return -1;
            //         }
        }
    }

    class WaypointViewerContentProvider implements IStructuredContentProvider {

        @Override
        public void dispose() {
        }

        @Override
        public Object[] getElements(final Object inputElement) {
            if (_tourData == null) {
                return new Object[0];
            } else {
                return _tourData.getTourWayPoints().toArray();
            }
        }

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

    public TourWaypointView() {
        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) == TourWaypointView.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

                    UI.updateUnits();
                    updateInternalUnitValues();

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

                    _wpViewer = (TableViewer) recreateViewer(_wpViewer);

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

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

                    _wpViewer.refresh();

                    /*
                     * the tree must be redrawn because the styled text does not show with the new
                     * color
                     */
                    _wpViewer.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 == TourWaypointView.this) {
                    return;
                }
                onSelectionChanged(selection);
            }
        };
        getViewSite().getPage().addPostSelectionListener(_postSelectionListener);
    }

    private void addTourEventListener() {

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

                if ((_tourData == null) || (part == TourWaypointView.this)) {
                    return;
                }

                if (eventId == TourEventId.TOUR_CHANGED || eventId == TourEventId.UPDATE_UI) {

                    // check if a tour must be updated

                    final long viewTourId = _tourData.getTourId();

                    if (UI.containsTourId(eventData, viewTourId) != null) {

                        // reload tour data
                        _tourData = TourManager.getInstance().getTourData(viewTourId);

                        _wpViewer.setInput(new Object[0]);

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

                    } else {
                        clearView();
                    }

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

                    clearView();
                }
            }
        };

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

    private void clearView() {

        _tourData = null;

        _wpViewer.setInput(new Object[0]);

        _postSelectionProvider.clearSelection();

        _pageBook.showPage(_pageNoData);
    }

    private void createActions() {

        _actionModifyColumns = new ActionModifyColumns(this);

    }

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

        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 Control viewerControl = _wpViewer.getControl();
        final Menu menu = menuMgr.createContextMenu(viewerControl);
        viewerControl.setMenu(menu);

        getSite().registerContextMenu(menuMgr, _wpViewer);
    }

    @Override
    public void createPartControl(final Composite parent) {

        _pc = new PixelConverter(parent);

        updateInternalUnitValues();

        _columnManager = new ColumnManager(this, _state);
        _columnManager.setIsCategoryAvailable(true);
        defineAllColumns(parent);

        createUI(parent);

        createActions();
        createContextMenu();
        fillToolbar();

        //      _actionEditTourWaypoints = new ActionOpenMarkerDialog(this, true);

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

        // 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);
        _pageBook.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        _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_WaypointViewer(_viewerContainer);
        }
    }

    private void createUI_10_WaypointViewer(final Composite parent) {

        final Table table = new Table(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);

        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        table.setHeaderVisible(true);
        //      table.setLinesVisible(_prefStore.getBoolean(ITourbookPreferences.VIEW_LAYOUT_DISPLAY_LINES));
        table.setLinesVisible(true);

        table.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(final KeyEvent e) {

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

                final IStructuredSelection selection = (IStructuredSelection) _wpViewer.getSelection();
                if ((selection.size() > 0) && (e.keyCode == SWT.CR)) {

                    // run async, otherwise it would pop up the dialog two times
                    //               Display.getCurrent().asyncExec(new Runnable() {
                    //                  public void run() {
                    //                     _actionEditTourWaypoints.setSelectedMarker((TourMarker) selection.getFirstElement());
                    //                     _actionEditTourWaypoints.run();
                    //                  }
                    //               });
                }
            }
        });

        /*
         * create table viewer
         */
        _wpViewer = new TableViewer(table);
        _columnManager.createColumns(_wpViewer);

        _wpViewer.setContentProvider(new WaypointViewerContentProvider());
        _wpViewer.setComparator(new WayPointComparator());

        _wpViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(final SelectionChangedEvent event) {
                final StructuredSelection selection = (StructuredSelection) event.getSelection();
                if (selection != null) {
                    fireWaypointPosition(selection);
                }
            }
        });

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

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

                // edit selected marker
                //            final IStructuredSelection selection = (IStructuredSelection) _wpViewer.getSelection();
                //            if (selection.size() > 0) {
                //               _actionEditTourWaypoints.setSelectedMarker((TourMarker) selection.getFirstElement());
                //               _actionEditTourWaypoints.run();
                //            }
            }
        });

        // the context menu must be created in this method otherwise it will not work when the viewer is recreated
        createUI_20_ContextMenu();
    }

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

        final Table table = (Table) _wpViewer.getControl();

        _columnManager.createHeaderContextMenu(table, null);
    }

    private void defineAllColumns(final Composite parent) {

        defineColumn_Name();
        defineColumn_Description();
        defineColumn_Comment();

        defineColumn_Category();
        defineColumn_Symbol();
        defineColumn_Altitude();

        defineColumn_Time();
        defineColumn_Date();
        defineColumn_Latitude();
        defineColumn_Longitude();

        defineColumn_Url();
        defineColumn_Id();
    }

    /**
     * column: altitude
     */
    private void defineColumn_Altitude() {

        final ColumnDefinition colDef = TableColumnFactory.WAYPOINT_ALTITUDE.createColumn(_columnManager, _pc);
        colDef.setIsDefaultColumn();
        colDef.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {

                final TourWayPoint wp = (TourWayPoint) cell.getElement();
                final float dbAltitude = wp.getAltitude();

                if (dbAltitude == Float.MIN_VALUE) {
                    cell.setText(UI.EMPTY_STRING);
                } else {

                    final float altitude = dbAltitude / _unitValueAltitude;

                    cell.setText(_nf_1_1.format(altitude));
                }
            }
        });
    }

    /**
     * column: category
     */
    private void defineColumn_Category() {

        final ColumnDefinition colDef = TableColumnFactory.WAYPOINT_CATEGORY.createColumn(_columnManager, _pc);
        colDef.setIsDefaultColumn();
        colDef.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {

                final TourWayPoint wp = (TourWayPoint) cell.getElement();
                cell.setText(wp.getCategory());
            }
        });
    }

    /**
     * column: comment
     */
    private void defineColumn_Comment() {

        final ColumnDefinition colDef = TableColumnFactory.WAYPOINT_COMMENT.createColumn(_columnManager, _pc);
        colDef.setIsDefaultColumn();
        colDef.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {

                final TourWayPoint wp = (TourWayPoint) cell.getElement();
                cell.setText(wp.getComment());
            }
        });
    }

    /**
     * column: date/time
     */
    private void defineColumn_Date() {

        final ColumnDefinition colDef = TableColumnFactory.WAYPOINT_DATE.createColumn(_columnManager, _pc);
        colDef.setIsDefaultColumn();
        colDef.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {

                final TourWayPoint wp = (TourWayPoint) cell.getElement();
                final long time = wp.getTime();

                cell.setText(time == 0 //
                        ? UI.EMPTY_STRING
                        : TimeTools.getZonedDateTime(time).format(TimeTools.Formatter_Date_S));
            }
        });
    }

    /**
     * column: description
     */
    private void defineColumn_Description() {

        final ColumnDefinition colDef = TableColumnFactory.WAYPOINT_DESCRIPTION.createColumn(_columnManager, _pc);
        colDef.setIsDefaultColumn();
        colDef.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {

                final TourWayPoint wp = (TourWayPoint) cell.getElement();
                cell.setText(wp.getDescription());
            }
        });
    }

    /**
     * column: id
     */
    private void defineColumn_Id() {

        final ColumnDefinition colDef = TableColumnFactory.WAYPOINT_ID.createColumn(_columnManager, _pc);
        colDef.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {

                final TourWayPoint wp = (TourWayPoint) cell.getElement();
                long wpId = wp.getWayPointId();

                if (wpId == TourDatabase.ENTITY_IS_NOT_SAVED) {
                    wpId = wp.getCreateId();
                }

                cell.setText(Long.toString(wpId));
            }
        });
    }

    /**
     * column: latitude
     */
    private void defineColumn_Latitude() {

        final ColumnDefinition colDef = TableColumnFactory.MOTION_LATITUDE.createColumn(_columnManager, _pc);
        colDef.setIsDefaultColumn();
        colDef.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {

                final TourWayPoint wp = (TourWayPoint) cell.getElement();
                cell.setText(Double.toString(wp.getLatitude()));
            }
        });
    }

    /**
     * column: longitude
     */
    private void defineColumn_Longitude() {

        final ColumnDefinition colDef = TableColumnFactory.MOTION_LONGITUDE.createColumn(_columnManager, _pc);
        colDef.setIsDefaultColumn();
        colDef.setCanModifyVisibility(true);
        colDef.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {

                final TourWayPoint wp = (TourWayPoint) cell.getElement();
                cell.setText(Double.toString(wp.getLongitude()));
            }
        });
    }

    /**
     * column: name
     */
    private void defineColumn_Name() {

        final ColumnDefinition colDef = TableColumnFactory.WAYPOINT_NAME.createColumn(_columnManager, _pc);
        colDef.setIsDefaultColumn();
        colDef.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {

                final TourWayPoint wp = (TourWayPoint) cell.getElement();
                cell.setText(wp.getName());
            }
        });
    }

    /**
     * column: symbol
     */
    private void defineColumn_Symbol() {

        final ColumnDefinition colDef = TableColumnFactory.WAYPOINT_SYMBOL.createColumn(_columnManager, _pc);
        colDef.setIsDefaultColumn();
        colDef.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {

                final TourWayPoint wp = (TourWayPoint) cell.getElement();
                cell.setText(wp.getSymbol());
            }
        });
    }

    /**
     * column: time
     */
    private void defineColumn_Time() {

        final ColumnDefinition colDef = TableColumnFactory.WAYPOINT_TIME.createColumn(_columnManager, _pc);
        colDef.setIsDefaultColumn();
        colDef.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {

                final TourWayPoint wp = (TourWayPoint) cell.getElement();
                final long time = wp.getTime();

                cell.setText(time == 0 //
                        ? UI.EMPTY_STRING
                        : TimeTools.getZonedDateTime(time).format(TimeTools.Formatter_Time_M));
            }
        });
    }

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

        final ColumnDefinition colDef = TableColumnFactory.MARKER_URL.createColumn(_columnManager, _pc);
        colDef.setIsDefaultColumn();
        colDef.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {

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

                String columnText = UI.EMPTY_STRING;

                final String urlText = marker.getUrlText();
                final String urlAddress = marker.getUrlAddress();

                final boolean isText = urlText != null && urlText.length() > 0;
                final boolean isAddress = urlAddress != null && 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);
            }
        });
    }

    @Override
    public void dispose() {

        final IWorkbenchPage page = getViewSite().getPage();

        TourManager.getInstance().removeTourEventListener(_tourPropertyListener);
        page.removePostSelectionListener(_postSelectionListener);
        page.removePartListener(_partListener);

        _prefStore.removePropertyChangeListener(_prefChangeListener);

        super.dispose();
    }

    private void fillContextMenu(final IMenuManager menuMgr) {

        //      menuMgr.add(_actionEditTourWaypoints);
        //
        //      // 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) _wpViewer.getSelection();
        //      _actionEditTourWaypoints.setSelectedMarker((TourMarker) selection.getFirstElement());
        //
        //      /*
        //       * enable actions
        //       */
        //      final boolean tourInDb = isTourInDb();
        //
        //      _actionEditTourWaypoints.setEnabled(tourInDb);
    }

    private void fillToolbar() {

        /*
         * fill view menu
         */
        final IMenuManager menuMgr = getViewSite().getActionBars().getMenuManager();

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

    /**
     * fire waypoint position
     */
    private void fireWaypointPosition(final StructuredSelection selection) {
        _postSelectionProvider.setSelection(selection);
    }

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

    @Override
    public ArrayList<TourData> getSelectedTours() {

        final ArrayList<TourData> selectedTours = new ArrayList<TourData>();
        selectedTours.add(_tourData);

        return selectedTours;
    }

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

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

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

        return false;
    }

    private void onSelectionChanged(final ISelection selection) {

        long tourId = TourDatabase.ENTITY_IS_NOT_SAVED;

        if (selection instanceof SelectionTourData) {

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

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

            if (_tourData != null) {
                tourId = _tourData.getTourId();
            }

        } 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)) {
                tourId = tourIds.get(0);
            }

        } 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 (tourId > TourDatabase.ENTITY_IS_NOT_SAVED) {

            final TourData tourData = TourManager.getInstance().getTourData(tourId);
            if (tourData != null) {
                _tourData = tourData;
            }
        }

        final boolean isTour = (tourId >= 0) && (_tourData != null);

        if (isTour) {
            _pageBook.showPage(_viewerContainer);
            _wpViewer.setInput(new Object[0]);
        }

        //      _actionEditTourWaypoints.setEnabled(isTour);
    }

    @Override
    public ColumnViewer recreateViewer(final ColumnViewer columnViewer) {

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

            createUI_10_WaypointViewer(_viewerContainer);
            _viewerContainer.layout();

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

        return _wpViewer;
    }

    @Override
    public void reloadViewer() {
        _wpViewer.setInput(new Object[0]);
    }

    private void saveState() {

        // check if UI is disposed
        final Table table = _wpViewer.getTable();
        if (table.isDisposed()) {
            return;
        }

        _columnManager.saveState(_state);
    }

    @Override
    public void setFocus() {
        _wpViewer.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;
                }

                final ArrayList<TourData> selectedTours = TourManager.getSelectedTours();
                if ((selectedTours != null) && (selectedTours.size() > 0)) {
                    onSelectionChanged(new SelectionTourData(selectedTours.get(0)));
                }
            }
        });
    }

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

    }

    private void updateInternalUnitValues() {

        _unitValueAltitude = UI.UNIT_VALUE_ALTITUDE;
    }

}