blob: 7a79b2dae1b53ba32bdf9f6b5dff54e335bec795 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 Laurent CARON.
* 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:
* Laurent CARON (laurent.caron@gmail.com) - initial API and implementation
*******************************************************************************/
package org.mihalis.opal.transitionComposite;
import org.eclipse.swt.widgets.Control;
/**
* Instances of this class are vertical transitions (down>up, up>down...)
*/
abstract class VerticalTransition implements Transition {
/**
* Perform transition.
*
* @param first the first
* @param second the second
* @see org.mihalis.opal.transitionComposite.Transition#performTransition(org.eclipse.swt.widgets.Control,
* org.eclipse.swt.widgets.Control)
*/
@Override
public void performTransition(final Control first, final Control second) {
if (first.isDisposed() || second.isDisposed()) {
return;
}
final int[] currentPosition = new int[1];
currentPosition[0] = 0;
final int maxValue = first.getParent().getClientArea().height;
first.setBounds(0, 0, first.getBounds().width, first.getBounds().height);
second.setBounds(0, -1 * second.getBounds().width, second.getBounds().width, second.getBounds().height);
first.moveAbove(second);
second.setVisible(true);
if (first.isDisposed() || first.getDisplay().isDisposed()) {
return;
}
first.getDisplay().timerExec(0, new Runnable() {
@Override
public void run() {
if (first.isDisposed() || second.isDisposed()) {
return;
}
currentPosition[0] = currentPosition[0] + 10;
if (currentPosition[0] > maxValue) {
first.setVisible(false);
second.setBounds(0, 0, first.getBounds().width, first.getBounds().height);
return;
}
first.setBounds(0, getCoeff() * currentPosition[0], first.getBounds().width, first.getBounds().height);
if (secondIsBehind()) {
second.setBounds(0, -1 * getCoeff() * (maxValue - currentPosition[0]), second.getBounds().width, second.getBounds().height);
}
if (!first.isDisposed() && !first.getDisplay().isDisposed()) {
first.getDisplay().timerExec(15, this);
}
}
});
}
/**
* Gets the coeff.
*
* @return the multiplicator coefficient
*/
protected abstract int getCoeff();
/**
* Second is behind.
*
* @return <code>true</code> if the second composite is behind the first
* one, <code>false</code> otherwise
*/
protected abstract boolean secondIsBehind();
}