/** * Copyright (c) 2005-2013 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ package org.python.pydev.shared_ui.dialogs; import org.eclipse.jface.dialogs.DialogSettings; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Shell; import org.python.pydev.shared_ui.SharedUiPlugin; /** * Recommended use: * * As a field from a dialog. Override: * public boolean close() { memento.writeSettings(getShell()); return super.close(); } public Control createDialogArea(Composite parent) { memento.readSettings(); return super.createDialogArea(parent); } protected Point getInitialSize() { return memento.getInitialSize(super.getInitialSize(), getShell()); } protected Point getInitialLocation(Point initialSize) { return memento.getInitialLocation(initialSize, super.getInitialLocation(initialSize), getShell()); } * */ public class DialogMemento { private IDialogSettings fSettings; private Point fLocation; private Point fSize; private static final String WIDTH = "width"; private static final String HEIGHT = "height"; public DialogMemento(Shell parent, String dialogSettings) { IDialogSettings settings = SharedUiPlugin.getDefault().getDialogSettings(); fSettings = settings.getSection(dialogSettings); if (fSettings == null) { fSettings = new DialogSettings(dialogSettings); settings.addSection(fSettings); fSettings.put(WIDTH, 480); fSettings.put(HEIGHT, 320); } } public Point getInitialSize(Point initialSize, Shell shell) { if (fSize != null) { initialSize.x = Math.max(initialSize.x, fSize.x); initialSize.y = Math.max(initialSize.y, fSize.y); Rectangle display = shell.getDisplay().getClientArea(); initialSize.x = Math.min(initialSize.x, display.width); initialSize.y = Math.min(initialSize.y, display.height); } return initialSize; } public Point getInitialLocation(Point initialSize, Point initialLocation, Shell shell) { if (fLocation != null) { initialLocation.x = fLocation.x; initialLocation.y = fLocation.y; Rectangle display = shell.getDisplay().getClientArea(); int xe = initialLocation.x + initialSize.x; if (xe > display.width) { initialLocation.x -= xe - display.width; } int ye = initialLocation.y + initialSize.y; if (ye > display.height) { initialLocation.y -= ye - display.height; } } return initialLocation; } /** * Initializes itself from the dialog settings with the same state * as at the previous invocation. */ public void readSettings() { try { int x = fSettings.getInt("x"); int y = fSettings.getInt("y"); fLocation = new Point(x, y); } catch (NumberFormatException e) { fLocation = null; } try { int width = fSettings.getInt("width"); int height = fSettings.getInt("height"); fSize = new Point(width, height); } catch (NumberFormatException e) { fSize = null; } } /** * Stores it current configuration in the dialog store. */ public void writeSettings(Shell shell) { Point location = shell.getLocation(); fSettings.put("x", location.x); fSettings.put("y", location.y); Point size = shell.getSize(); fSettings.put("width", size.x); fSettings.put("height", size.y); } }