/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.sdkuilib.internal.repository.ui; import com.android.prefs.AndroidLocation; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Monitor; import org.eclipse.swt.widgets.Shell; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Properties; /** * Utility to save & restore the size and position on a window * using a common config file. */ public class ShellSizeAndPos { private static final String SETTINGS_FILENAME = "androidwin.cfg"; //$NON-NLS-1$ private static final String PX = "_px"; //$NON-NLS-1$ private static final String PY = "_py"; //$NON-NLS-1$ private static final String SX = "_sx"; //$NON-NLS-1$ private static final String SY = "_sy"; //$NON-NLS-1$ public static void loadSizeAndPos(Shell shell, String prefix) { Properties props = loadProperties(); try { int px = Integer.parseInt(props.getProperty(prefix + PX)); int py = Integer.parseInt(props.getProperty(prefix + PY)); int sx = Integer.parseInt(props.getProperty(prefix + SX)); int sy = Integer.parseInt(props.getProperty(prefix + SY)); Point p1 = new Point(px, py); Point p2 = new Point(px + sx, py + sy); Rectangle r = new Rectangle(px, py, sy, sy); Monitor bestMatch = null; int bestSurface = -1; for (Monitor monitor : shell.getDisplay().getMonitors()) { Rectangle area = monitor.getClientArea(); if (area.contains(p1) && area.contains(p2)) { // The shell is fully visible on this monitor. Just use that. bestMatch = monitor; bestSurface = Integer.MAX_VALUE; break; } else { // Find which monitor displays the largest surface of the window. // We'll use this one to center the window there, to make sure we're not // starting split between several monitors. Rectangle i = area.intersection(r); int surface = i.width * i.height; if (surface > bestSurface) { bestSurface = surface; bestMatch = monitor; } } } if (bestMatch != null && bestSurface != Integer.MAX_VALUE) { // Recenter the window on this monitor and make sure it fits Rectangle area = bestMatch.getClientArea(); sx = Math.min(sx, area.width); sy = Math.min(sy, area.height); px = area.x + (area.width - sx) / 2; py = area.y + (area.height - sy) / 2; } shell.setLocation(px, py); shell.setSize(sx, sy); } catch ( Exception e) { // Ignore exception. We could typically get NPE from the getProperty // or NumberFormatException from parseInt calls. Either way, do // nothing if anything goes wrong. } } public static void saveSizeAndPos(Shell shell, String prefix) { Properties props = loadProperties(); Point loc = shell.getLocation(); Point size = shell.getSize(); props.setProperty(prefix + PX, Integer.toString(loc.x)); props.setProperty(prefix + PY, Integer.toString(loc.y)); props.setProperty(prefix + SX, Integer.toString(size.x)); props.setProperty(prefix + SY, Integer.toString(size.y)); saveProperties(props); } /** * Load properties saved in {@link #SETTINGS_FILENAME}. * If the file does not exists or doesn't load properly, just return an * empty set of properties. */ private static Properties loadProperties() { Properties props = new Properties(); FileInputStream fis = null; try { String folder = AndroidLocation.getFolder(); File f = new File(folder, SETTINGS_FILENAME); if (f.exists()) { fis = new FileInputStream(f); props.load(fis); } } catch (Exception e) { // Ignore } finally { if (fis != null) { try { fis.close(); } catch (IOException e) { } } } return props; } private static void saveProperties(Properties props) { FileOutputStream fos = null; try { String folder = AndroidLocation.getFolder(); File f = new File(folder, SETTINGS_FILENAME); fos = new FileOutputStream(f); props.store(fos, "## Size and Pos for SDK Manager Windows"); //$NON-NLS-1$ } catch (Exception e) { // ignore } finally { if (fos != null) { try { fos.close(); } catch (IOException e) { } } } } }