/*******************************************************************************
 * Copyright (c) 2000, 2004 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.swt.snippets;

/*
 * Create two ScrolledComposites that scroll in tandem.
 *
 * For a list of all SWT example snippets see
 * http://www.eclipse.org/swt/snippets/
 */

import org.eclipse.swt.*;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

public class Snippet167 {

public static void main (String [] args) {
	Display display = new Display ();
	Shell shell = new Shell (display);
	shell.setLayout(new FillLayout());

	final ScrolledComposite sc1 = new ScrolledComposite (shell, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
	Button button1 = new Button (sc1, SWT.PUSH);
	button1.setText ("Button 1");
	button1.setSize (400, 300);
	sc1.setContent (button1);

	final ScrolledComposite sc2 = new ScrolledComposite (shell, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
	Button button2 = new Button(sc2, SWT.PUSH);
	button2.setText ("Button 2");
	button2.setSize (300, 400);
	sc2.setContent (button2);

	final ScrollBar vBar1 = sc1.getVerticalBar ();
	final ScrollBar vBar2 = sc2.getVerticalBar ();
	final ScrollBar hBar1 = sc1.getHorizontalBar ();
	final ScrollBar hBar2 = sc2.getHorizontalBar ();
	SelectionListener listener1 = new SelectionAdapter () {
		public void widgetSelected (SelectionEvent e) {
			int x =  hBar1.getSelection() * (hBar2.getMaximum() - hBar2.getThumb()) / Math.max(1, hBar1.getMaximum() - hBar1.getThumb());
			int y =  vBar1.getSelection() * (vBar2.getMaximum() - vBar2.getThumb()) / Math.max(1, vBar1.getMaximum() - vBar1.getThumb());
			sc2.setOrigin (x, y);
		}
	};
	SelectionListener listener2 = new SelectionAdapter () {
		public void widgetSelected (SelectionEvent e) {
			int x =  hBar2.getSelection() * (hBar1.getMaximum() - hBar1.getThumb()) / Math.max(1, hBar2.getMaximum() - hBar2.getThumb());
			int y =  vBar2.getSelection() * (vBar1.getMaximum() - vBar1.getThumb()) / Math.max(1, vBar2.getMaximum() - vBar2.getThumb());
			sc1.setOrigin (x, y);
		}
	};
	vBar1.addSelectionListener (listener1);
	hBar1.addSelectionListener (listener1);
	vBar2.addSelectionListener (listener2);
	hBar2.addSelectionListener (listener2);

	shell.setSize (400, 300);
	shell.open ();
	while (!shell.isDisposed ()) {
		if (!display.readAndDispatch ()) display.sleep ();
	}
	display.dispose ();
}
}
