/*******************************************************************************
* Copyright (c) Emil Crumhorn - Hexapixel.com - emil.crumhorn@gmail.com
* 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:
* emil.crumhorn@gmail.com - initial API and implementation
* ziogiannigmail.com - Bug 464509 - Minute View Implementation
*******************************************************************************/
package org.eclipse.nebula.widgets.ganttchart;
import java.util.Calendar;
import org.eclipse.swt.widgets.Display;
class ViewPortHandler implements IViewPortHandler2 {
private GanttComposite _ganttComposite;
public ViewPortHandler(GanttComposite parent) {
_ganttComposite = parent;
}
public void scrollingLeft(final int diffCount) {
int diff = diffCount;
int mCurrentView = _ganttComposite.getCurrentView();
_ganttComposite.showScrollDate();
if (diff == 1) {
if (mCurrentView == ISettings.VIEW_YEAR) {
prevMonth();
return;
}
else {
if (mCurrentView == ISettings.VIEW_DAY) {
prevHour();
return;
}else
if (mCurrentView == ISettings.VIEW_MINUTE) {
prevMinute();
return;
}
else {
prevDay();
return;
}
}
}
else {
if (diff == 0) {
if (mCurrentView == ISettings.VIEW_YEAR) {
prevWeek();
return;
}
else {
if (mCurrentView == ISettings.VIEW_DAY) {
prevHour();
return;
}else
if (mCurrentView == ISettings.VIEW_MINUTE) {
prevMinute();
return;
}
else {
prevDay();
return;
}
}
}
// year scrolls so fast that the events actually lose position, this is no good, so we need to break the speed
if (mCurrentView == ISettings.VIEW_YEAR) {
if (diff > 7)
diff = 7;
}
for (int i = 0; i < diff; i++) {
if (mCurrentView == ISettings.VIEW_YEAR) {
prevMonth();
}
else {
if (mCurrentView == ISettings.VIEW_DAY) {
prevHour();
}else
if (mCurrentView == ISettings.VIEW_MINUTE) {
prevMinute();
return;
}
else {
prevDay();
}
}
}
}
}
public void scrollingRight(final int diffCount) {
int diff = diffCount;
int mCurrentView = _ganttComposite.getCurrentView();
_ganttComposite.showScrollDate();
if (diff == 1) {
if (mCurrentView == ISettings.VIEW_YEAR) {
nextMonth();
return;
}
else {
if (mCurrentView == ISettings.VIEW_DAY) {
nextHour();
return;
}
else
if (mCurrentView == ISettings.VIEW_MINUTE) {
nextMinute();
return;
}
else {
nextDay();
return;
}
}
}
else {
// far right
if (diff == 0) {
if (mCurrentView == ISettings.VIEW_YEAR) {
nextWeek();
return;
}
else {
if (mCurrentView == ISettings.VIEW_DAY) {
nextHour();
return;
}else
if (mCurrentView == ISettings.VIEW_MINUTE) {
nextMinute();
return;
}
else {
nextDay();
return;
}
}
}
// year scrolls so fast that the events actually lose position, this is no good, so we need to break the speed
// TODO: look into this a bit more, as it's quite odd (same for scrollingLeft)
if (mCurrentView == ISettings.VIEW_YEAR) {
if (diff > 7)
diff = 7;
}
for (int i = 0; i < diff; i++) {
if (mCurrentView == ISettings.VIEW_YEAR) {
nextMonth();
}
else {
if (mCurrentView == ISettings.VIEW_DAY) {
nextHour();
}else
if (mCurrentView == ISettings.VIEW_MINUTE) {
nextMinute();
return;
}
else {
nextDay();
}
}
}
}
}
/**
* Jumps to the next month.
*/
public void nextMonth() {
Calendar mCalendar = _ganttComposite.getRootCalendar();
mCalendar.set(Calendar.DATE, 1);
mCalendar.add(Calendar.MONTH, 1);
_ganttComposite.setNoRecalc();
_ganttComposite.moveXBounds(false);
_ganttComposite.redraw();
}
/**
* Jumps to the previous month.
*/
public void prevMonth() {
Calendar mCalendar = _ganttComposite.getRootCalendar();
mCalendar.set(Calendar.DATE, 1);
mCalendar.add(Calendar.MONTH, -1);
_ganttComposite.setNoRecalc();
_ganttComposite.moveXBounds(true);
_ganttComposite.redraw();
}
/**
* Jumps one week forward.
*/
public void nextWeek() {
Calendar mCalendar = _ganttComposite.getRootCalendar();
mCalendar.add(Calendar.DATE, 7);
_ganttComposite.setNoRecalc();
_ganttComposite.moveXBounds(false);
_ganttComposite.redraw();
}
/**
* Jumps one week backwards.
*/
public void prevWeek() {
Calendar mCalendar = _ganttComposite.getRootCalendar();
mCalendar.add(Calendar.DATE, -7);
_ganttComposite.setNoRecalc();
_ganttComposite.moveXBounds(true);
_ganttComposite.redraw();
}
/**
* Jumps to the next minute.
*/
public void nextMinute() {
Display.getDefault().asyncExec(new Runnable(){
public void run(){
try {
Calendar mCalendar = _ganttComposite.getRootCalendar();
mCalendar.add(Calendar.MINUTE, 1);
if (mCalendar.get(Calendar.MINUTE) >= 60) {
mCalendar.add(Calendar.HOUR_OF_DAY, 1);
mCalendar.set(Calendar.MINUTE, 0);
}
Thread.sleep(50);
if (_ganttComposite != null && !_ganttComposite.isDisposed()){
_ganttComposite.setNoRecalc();
_ganttComposite.moveXBounds(false);
_ganttComposite.redraw();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
/**
* Jumps to the previous hour.
*/
public void prevMinute() {
Display.getDefault().asyncExec(new Runnable(){
public void run(){
try {
Calendar mCalendar = _ganttComposite.getRootCalendar();
mCalendar.add(Calendar.MINUTE, -1);
if (mCalendar.get(Calendar.MINUTE) < 0) {
mCalendar.add(Calendar.HOUR_OF_DAY, -1);
mCalendar.set(Calendar.MINUTE, 60 - 1);
}
Thread.sleep(50);
if (_ganttComposite != null && !_ganttComposite.isDisposed()){
_ganttComposite.setNoRecalc();
_ganttComposite.moveXBounds(true);
_ganttComposite.redraw();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
/**
* Jumps to the next hour.
*/
public void nextHour() {
Calendar mCalendar = _ganttComposite.getRootCalendar();
mCalendar.add(Calendar.HOUR_OF_DAY, 1);
if (mCalendar.get(Calendar.HOUR_OF_DAY) >= 24) {
mCalendar.add(Calendar.DATE, 1);
mCalendar.set(Calendar.HOUR_OF_DAY, 0);
}
_ganttComposite.setNoRecalc();
_ganttComposite.moveXBounds(false);
_ganttComposite.redraw();
}
/**
* Jumps to the previous hour.
*/
public void prevHour() {
Calendar mCalendar = _ganttComposite.getRootCalendar();
mCalendar.add(Calendar.HOUR_OF_DAY, -1);
if (mCalendar.get(Calendar.HOUR_OF_DAY) < 0) {
mCalendar.add(Calendar.DATE, -1);
// -1 !!
mCalendar.set(Calendar.HOUR_OF_DAY, 24 - 1);
}
_ganttComposite.setNoRecalc();
_ganttComposite.moveXBounds(true);
_ganttComposite.redraw();
}
/**
* Jumps one day forward.
*/
public void nextDay() {
Calendar mCalendar = _ganttComposite.getRootCalendar();
mCalendar.add(Calendar.DATE, 1);
mCalendar.set(Calendar.HOUR_OF_DAY, 0);
_ganttComposite.moveXBounds(false);
_ganttComposite.setNoRecalc();
_ganttComposite.redraw();
}
/**
* Jumps one day backwards.
*/
public void prevDay() {
Calendar mCalendar = _ganttComposite.getRootCalendar();
mCalendar.add(Calendar.DATE, -1);
mCalendar.set(Calendar.HOUR_OF_DAY, 0);
_ganttComposite.moveXBounds(true);
_ganttComposite.setNoRecalc();
_ganttComposite.redraw();
}
}