/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jkiss.dbeaver.ui.controls.resultset;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.contexts.IContextActivation;
import org.eclipse.ui.contexts.IContextService;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.model.data.DBDAttributeBinding;
import org.jkiss.dbeaver.ui.UIUtils;
import java.util.ArrayList;
import java.util.List;
/**
* Abstract presentation.
*/
public abstract class AbstractPresentation implements IResultSetPresentation, ISelectionProvider {
private static final String PRESENTATION_CONTROL_ID = "org.jkiss.dbeaver.ui.resultset.presentation";
//public static final String RESULTS_CONTROL_CONTEXT_ID = "org.jkiss.dbeaver.ui.context.resultset.focused";
public static final StructuredSelection EMPTY_SELECTION = new StructuredSelection();
@NotNull
protected IResultSetController controller;
private final List<ISelectionChangedListener> selectionChangedListenerList = new ArrayList<>();
@Override
@NotNull
public IResultSetController getController() {
return controller;
}
@Override
public void createPresentation(@NotNull final IResultSetController controller, @NotNull Composite parent) {
this.controller = controller;
}
@Override
public void fillMenu(@NotNull IMenuManager menu) {
}
/**
* Shifts current row and redraws current control.
* In record mode refreshes data.
* @param position position
*/
@Override
public void scrollToRow(@NotNull RowPosition position) {
ResultSetRow currentRow = controller.getCurrentRow();
ResultSetModel model = controller.getModel();
switch (position) {
case FIRST:
if (model.getRowCount() > 0) {
controller.setCurrentRow(model.getRow(0));
}
break;
case PREVIOUS:
if (currentRow != null && currentRow.getVisualNumber() > 0) {
controller.setCurrentRow(model.getRow(currentRow.getVisualNumber() - 1));
}
break;
case NEXT:
if (currentRow != null && currentRow.getVisualNumber() < model.getRowCount() - 1) {
controller.setCurrentRow(model.getRow(currentRow.getVisualNumber() + 1));
}
break;
case LAST:
if (currentRow != null) {
controller.setCurrentRow(model.getRow(model.getRowCount() - 1));
}
break;
case CURRENT:
// do nothing
break;
}
if (controller.isRecordMode()) {
refreshData(true, false, false);
} else {
getControl().redraw();
}
controller.updateStatusMessage();
controller.updateEditControls();
}
@Override
public void setCurrentAttribute(@NotNull DBDAttributeBinding attribute) {
}
@Override
public Point getCursorLocation() {
return null;
}
@Override
public void printResultSet() {
}
protected void registerContextMenu() {
// Register context menu
MenuManager menuMgr = new MenuManager();
Menu menu = menuMgr.createContextMenu(getControl());
menuMgr.addMenuListener(new IMenuListener() {
@Override
public void menuAboutToShow(IMenuManager manager)
{
controller.fillContextMenu(
manager,
getCurrentAttribute(),
controller.getCurrentRow());
}
});
menuMgr.setRemoveAllWhenShown(true);
getControl().setMenu(menu);
controller.getSite().registerContextMenu(menuMgr, null);
}
protected void trackPresentationControl() {
final Control control = getControl();
final IWorkbenchPartSite site = controller.getSite();
UIUtils.addFocusTracker(site, PRESENTATION_CONTROL_ID, control);
/*
final IContextService contextService = site.getService(IContextService.class);
if (contextService != null) {
control.addFocusListener(new FocusListener() {
IContextActivation activation;
@Override
public void focusGained(FocusEvent e) {
if (activation == null) {
activation = contextService.activateContext(RESULTS_CONTROL_CONTEXT_ID);
}
}
@Override
public void focusLost(FocusEvent e) {
contextService.deactivateContext(activation);
}
});
}
*/
control.addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
UIUtils.removeFocusTracker(site, control);
}
});
}
///////////////////////////////////////////////////////////////////////
// ISelectionProvider
protected void fireSelectionChanged(ISelection selection) {
SelectionChangedEvent event = new SelectionChangedEvent(this, selection);
for (ISelectionChangedListener listener : selectionChangedListenerList) {
listener.selectionChanged(event);
}
}
@Override
public void addSelectionChangedListener(ISelectionChangedListener listener) {
selectionChangedListenerList.add(listener);
}
@Override
public void removeSelectionChangedListener(ISelectionChangedListener listener) {
selectionChangedListenerList.remove(listener);
}
@Override
public ISelection getSelection() {
return EMPTY_SELECTION;
}
@Override
public void setSelection(ISelection selection) {
}
}