content: /*******************************************************************************
   * Copyright (c) 2000, 2007 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.wst.jsdt.internal.ui.compare;
  
  import java.util.ResourceBundle;
  
  import org.eclipse.compare.CompareUI;
  import org.eclipse.jface.dialogs.DialogSettings;
  import org.eclipse.jface.dialogs.IDialogSettings;
  import org.eclipse.jface.dialogs.TrayDialog;
  import org.eclipse.swt.SWT;
  import org.eclipse.swt.events.ControlEvent;
  import org.eclipse.swt.events.ControlListener;
  import org.eclipse.swt.graphics.Point;
  import org.eclipse.swt.graphics.Rectangle;
  import org.eclipse.swt.widgets.Shell;
  
  /**
   * Base class for resizable Dialogs with persistent window bounds.
   */
  public abstract class ResizableDialog extends TrayDialog {
  
  	// dialog store id constants
  	private final static String DIALOG_BOUNDS_KEY= "ResizableDialogBounds"; //$NON-NLS-1$
  	private static final String X= "x"; //$NON-NLS-1$
  	private static final String Y= "y"; //$NON-NLS-1$
  	private static final String WIDTH= "width"; //$NON-NLS-1$
  	private static final String HEIGHT= "height"; //$NON-NLS-1$
  	
  	protected ResourceBundle fBundle;
  	private Rectangle fNewBounds;
  	private IDialogSettings fSettings;
  
  	public ResizableDialog(Shell parent, ResourceBundle bundle) {
  		super(parent);
  		setShellStyle(getShellStyle() | SWT.RESIZE  | SWT.MAX);
  		
  		fBundle= bundle;
  		
  		fSettings= CompareUI.getPlugin().getDialogSettings();
  	}
  	
  	protected Point getInitialSize() {
  		
  		int width= 0;
  		int height= 0;
  		
  		final Shell s= getShell();
  		if (s != null) {
  			s.addControlListener(
  				new ControlListener() {
  					public void controlMoved(ControlEvent arg0) {
  						fNewBounds= s.getBounds();
  					}
  					public void controlResized(ControlEvent arg0) {
  						fNewBounds= s.getBounds();
  					}
  				}
  			);
  		}
  		
  		IDialogSettings bounds= fSettings.getSection(DIALOG_BOUNDS_KEY); 
  		if (bounds == null) {
  			if (fBundle != null) {
  				width= JavaCompareUtilities.getInteger(fBundle, WIDTH, 0);
  				height= JavaCompareUtilities.getInteger(fBundle, HEIGHT, 0);
  				Shell shell= getParentShell();
  				if (shell != null) {
  					Point parentSize= shell.getSize();
  					if (width <= 0)
  						width= parentSize.x-300;
  					if (height <= 0)
  						height= parentSize.y-200;
  				}
  			} else {
  				Shell shell= getParentShell();
  				if (shell != null) {
  					Point parentSize= shell.getSize();
  					width= parentSize.x-100;
  					height= parentSize.y-100;
  				}
  			}
  			if (width < 700)
  				width= 700;
  			if (height < 500)
  				height= 500;
  		} else {
  			try {
  				width= bounds.getInt(WIDTH);
  			} catch (NumberFormatException e) {
  				width= 700;
  			}
  			try {
  				height= bounds.getInt(HEIGHT);
  			} catch (NumberFormatException e) {
  				height= 500;
  			}
  		}	
  	
  		return new Point(width, height);
  	}
  	
  	protected Point getInitialLocation(Point initialSize) {
  		Point loc= super.getInitialLocation(initialSize);
  		
  		IDialogSettings bounds= fSettings.getSection(DIALOG_BOUNDS_KEY);
  		if (bounds != null) {
  			try {
  				loc.x= bounds.getInt(X);
  			} catch (NumberFormatException e) {
  				// silently ignored
  			}
  			try {
  				loc.y= bounds.getInt(Y);
  			} catch (NumberFormatException e) {
  				// silently ignored
  			}
  		}
  		return loc;
  	}
  	
  	public boolean close() {
  		boolean closed= super.close();
  		if (closed && fNewBounds != null)
  			saveBounds(fNewBounds);
  		return closed;
  	}
  
  	private void saveBounds(Rectangle bounds) {
  		IDialogSettings dialogBounds= fSettings.getSection(DIALOG_BOUNDS_KEY);
  		if (dialogBounds == null) {
  			dialogBounds= new DialogSettings(DIALOG_BOUNDS_KEY);
  			fSettings.addSection(dialogBounds);
  		}
  		dialogBounds.put(X, bounds.x);
  		dialogBounds.put(Y, bounds.y);
  		dialogBounds.put(WIDTH, bounds.width);
  		dialogBounds.put(HEIGHT, bounds.height);
  	}
  }
  