/*******************************************************************************
* Copyright 2017 Capital One Services, LLC and Bitwise, Inc.
* 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 hydrograph.ui.dataviewer.listeners;
import hydrograph.ui.dataviewer.actions.SelectColumnAction;
import hydrograph.ui.dataviewer.adapters.DataViewerAdapter;
import hydrograph.ui.dataviewer.constants.Messages;
import hydrograph.ui.dataviewer.constants.StatusConstants;
import hydrograph.ui.dataviewer.constants.ControlConstants;
import hydrograph.ui.dataviewer.constants.Views;
import hydrograph.ui.dataviewer.datastructures.StatusMessage;
import hydrograph.ui.dataviewer.support.StatusManager;
import hydrograph.ui.dataviewer.utilities.DataViewerUtility;
import hydrograph.ui.dataviewer.viewloders.DataViewLoader;
import hydrograph.ui.dataviewer.window.DebugDataViewer;
import java.util.Map;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Widget;
/**
* The Class DataViewerListeners.
* DataViewerListeners holds all listener for Data viewer Windows.
*
* @author Bitwise
*
*/
public class DataViewerListeners {
private DataViewLoader dataViewLoader;
private StatusManager statusManager;
private DataViewerAdapter dataViewerAdapter;
private Map<String, Control> windowControls;
private static final int ENTER_KEY_CODE=13;
private DebugDataViewer debugDataViewer;
/**
*
* Set data view loader
*
*/
public void setDataViewLoader(DataViewLoader dataViewLoader) {
this.dataViewLoader = dataViewLoader;
}
/**
*
* Set {@link DataViewerAdapter}
*
*/
public void setDataViewerAdpater(DataViewerAdapter dataViewerAdapter) {
this.dataViewerAdapter = dataViewerAdapter;
}
/**
*
* set {@link StatusManager}
*
* @param statusManager
*/
public void setStatusManager(StatusManager statusManager) {
this.statusManager = statusManager;
}
/**
*
* Set data viewer window control list
*
* @param windowControls
*/
public void setWindowControls(Map<String, Control> windowControls) {
this.windowControls = windowControls;
}
/**
*
* Set debug data viewer
*
* @param debugDataViewer
*/
public void setDebugDataViewer(DebugDataViewer debugDataViewer) {
this.debugDataViewer = debugDataViewer;
}
/**
*
* Attach data viewer tab folder listener. This listener loads data in selected view
*
* @param tabFolder
*/
public void addTabFolderSelectionChangeListener(CTabFolder tabFolder) {
tabFolder.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
dataViewLoader.reloadloadViews();
disableColumnSelectionForUnformattedView(e);
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
// DO Nothing
}
});
}
private void disableColumnSelectionForUnformattedView(
SelectionEvent e) {
if(e.item.getData("VIEW_NAME").equals(Views.UNFORMATTED_VIEW_NAME)){
debugDataViewer.getActionFactory().getAction(SelectColumnAction.class.getName()).setEnabled(false);
}else{
debugDataViewer.getActionFactory().getAction(SelectColumnAction.class.getName()).setEnabled(true);
}
}
private void jumpPageListener() {
final Text jumpPageTextBox = ((Text) windowControls.get(ControlConstants.JUMP_TEXT));
if (((Text) windowControls.get(ControlConstants.JUMP_TEXT)).getText().isEmpty()) {
statusManager.setStatus(new StatusMessage(StatusConstants.ERROR, Messages.JUMP_PAGE_TEXTBOX_CAN_NOTE_BE_EMPTY));
return;
}
String statusMessage=Messages.FETCHING_PAGE + " " + jumpPageTextBox.getText();
statusManager.setStatus(new StatusMessage(StatusConstants.PROGRESS, statusMessage));
statusManager.setAllWindowControlsEnabled(false);
Long pageNumberToJump = Long.valueOf(jumpPageTextBox.getText());
executeJumpPageJob(statusMessage, pageNumberToJump);
}
private void executeJumpPageJob(String statusMessage, final Long pageNumberToJump) {
Job job = new Job(statusMessage) {
@Override
protected IStatus run(IProgressMonitor monitor) {
final StatusMessage status = dataViewerAdapter.jumpToPage(pageNumberToJump);
dataViewLoader.updateDataViewLists();
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
refreshDataViewerWindow(status);
DataViewerUtility.INSTANCE.resetSort(debugDataViewer);
debugDataViewer.redrawTableCursor();
}
});
return Status.OK_STATUS;
}
};
job.schedule();
}
/**
*
* Attach jump page listener.
* The listener can be attached to only Button and Text box
*
* @param widget
*/
public void attachJumpPageListener(final Widget widget) {
if (widget instanceof Text) {
((Text) widget).addKeyListener(new KeyListener() {
@Override
public void keyReleased(KeyEvent e) {
if (e.keyCode == SWT.KEYPAD_CR || e.keyCode == ENTER_KEY_CODE) {
jumpPageListener();
}
}
@Override
public void keyPressed(KeyEvent e) {
// Nothing to do
}
});
}
if (widget instanceof Button) {
((Button) widget).addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
jumpPageListener();
}
});
}
}
/**
*
* Attach Previous page listener.
*
* @param button
*/
public void attachPreviousPageButtonListener(Button button) {
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
statusManager.setStatus(new StatusMessage(StatusConstants.PROGRESS, Messages.FETCHING_PREVIOUS_PAGE));
statusManager.setAllWindowControlsEnabled(false);
Job job = new Job(Messages.FETCHING_PREVIOUS_PAGE) {
@Override
protected IStatus run(IProgressMonitor monitor) {
final StatusMessage status = dataViewerAdapter.previous();
dataViewLoader.updateDataViewLists();
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
refreshDataViewerWindow(status);
statusManager.clearJumpToPageText();
DataViewerUtility.INSTANCE.resetSort(debugDataViewer);
debugDataViewer.redrawTableCursor();
}
});
return Status.OK_STATUS;
}
};
job.schedule();
}
});
}
/**
*
* Attach next page listener
*
* @param button
*/
public void attachNextPageButtonListener(Button button) {
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
statusManager.setStatus(new StatusMessage(StatusConstants.PROGRESS, Messages.FETCHING_NEXT_PAGE));
statusManager.setAllWindowControlsEnabled(false);
Job job = new Job(Messages.FETCHING_NEXT_PAGE) {
@Override
protected IStatus run(IProgressMonitor monitor) {
final StatusMessage status = dataViewerAdapter.next();
dataViewLoader.updateDataViewLists();
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
refreshDataViewerWindow(status);
statusManager.clearJumpToPageText();
DataViewerUtility.INSTANCE.resetSort(debugDataViewer);
debugDataViewer.redrawTableCursor();
}
});
return Status.OK_STATUS;
}
};
job.schedule();
}
});
}
private void refreshDataViewerWindow(final StatusMessage status) {
dataViewLoader.reloadloadViews();
statusManager.setAllWindowControlsEnabled(true);
statusManager.setStatus(status);
}
}