org.eclipse.swt.widgets.Monitor Java Examples

The following examples show how to use org.eclipse.swt.widgets.Monitor. You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: BaseTransformDialog.java    From hop with Apache License 2.0 6 votes vote down vote up
public static void setSize( Shell shell, int prefWidth, int prefHeight ) {
  PropsUi props = PropsUi.getInstance();

  WindowProperty winprop = props.getScreen( shell.getText() );
  if ( winprop != null ) {
    winprop.setShell( shell, prefWidth, prefHeight );
  } else {
    shell.layout();

    winprop = new WindowProperty( shell.getText(), false, 0, 0, prefWidth, prefHeight );
    winprop.setShell( shell );

    // Now, as this is the first time it gets opened, try to put it in the middle of the screen...
    Rectangle shellBounds = shell.getBounds();
    Monitor monitor = shell.getDisplay().getPrimaryMonitor();
    if ( shell.getParent() != null ) {
      monitor = shell.getParent().getMonitor();
    }
    Rectangle monitorClientArea = monitor.getClientArea();

    int middleX = monitorClientArea.x + ( monitorClientArea.width - shellBounds.width ) / 2;
    int middleY = monitorClientArea.y + ( monitorClientArea.height - shellBounds.height ) / 2;

    shell.setLocation( middleX, middleY );
  }
}
 
Example #2
Source File: BreadcrumbItemDropDown.java    From gwt-eclipse-plugin with Eclipse Public License 1.0 6 votes vote down vote up
/**
 * Returns the monitor whose client area contains the given point. If no
 * monitor contains the point, returns the monitor that is closest to the
 * point.
 * <p>
 * Copied from
 * <code>org.eclipse.jface.window.Window.getClosestMonitor(Display, Point)</code>
 * </p>
 * 
 * @param display the display showing the monitors
 * @param point point to find (display coordinates)
 * @return the monitor closest to the given point
 */
private static Monitor getClosestMonitor(Display display, Point point) {
  int closest = Integer.MAX_VALUE;

  Monitor[] monitors = display.getMonitors();
  Monitor result = monitors[0];

  for (int i = 0; i < monitors.length; i++) {
    Monitor current = monitors[i];

    Rectangle clientArea = current.getClientArea();

    if (clientArea.contains(point))
      return current;

    int distance = Geometry.distanceSquared(Geometry.centerPoint(clientArea),
        point);
    if (distance < closest) {
      closest = distance;
      result = current;
    }
  }

  return result;
}
 
Example #3
Source File: WorkbenchHelper.java    From gama with GNU General Public License v3.0 6 votes vote down vote up
public static Shell obtainFullScreenShell(final int id) {
	final Monitor[] monitors = WorkbenchHelper.getDisplay().getMonitors();
	int monitorId = id;
	if (monitorId < 0) {
		monitorId = 0;
	}
	if (monitorId > monitors.length - 1) {
		monitorId = monitors.length - 1;
	}
	final Rectangle bounds = monitors[monitorId].getBounds();

	final Shell fullScreenShell = new Shell(WorkbenchHelper.getDisplay(), SWT.NO_TRIM | SWT.ON_TOP);
	fullScreenShell.setBounds(bounds);
	final FillLayout fl = new FillLayout();
	fl.marginHeight = 0;
	fl.marginWidth = 0;
	fl.spacing = 0;
	// final GridLayout gl = new GridLayout(1, true);
	// gl.horizontalSpacing = 0;
	// gl.marginHeight = 0;
	// gl.marginWidth = 0;
	// gl.verticalSpacing = 0;
	fullScreenShell.setLayout(fl);
	return fullScreenShell;
}
 
Example #4
Source File: GamlSearchField.java    From gama with GNU General Public License v3.0 6 votes vote down vote up
/**
 * This method was copy/pasted from JFace.
 */
private static Monitor getClosestMonitor(final Display toSearch, final Point toFind) {
	int closest = Integer.MAX_VALUE;

	final Monitor[] monitors = toSearch.getMonitors();
	Monitor result = monitors[0];

	for (final Monitor current : monitors) {
		final Rectangle clientArea = current.getClientArea();

		if (clientArea.contains(toFind)) { return current; }

		final int distance = Geometry.distanceSquared(Geometry.centerPoint(clientArea), toFind);
		if (distance < closest) {
			closest = distance;
			result = current;
		}
	}

	return result;
}
 
Example #5
Source File: GamlSearchField.java    From gama with GNU General Public License v3.0 6 votes vote down vote up
/**
 * This method was copy/pasted from JFace.
 */
private Rectangle getConstrainedShellBounds(final Display display, final Rectangle preferredSize) {
	final Rectangle result =
			new Rectangle(preferredSize.x, preferredSize.y, preferredSize.width, preferredSize.height);

	final Point topLeft = new Point(preferredSize.x, preferredSize.y);
	final Monitor mon = getClosestMonitor(display, topLeft);
	final Rectangle bounds = mon.getClientArea();

	if (result.height > bounds.height) {
		result.height = bounds.height;
	}

	if (result.width > bounds.width) {
		result.width = bounds.width;
	}

	result.x = Math.max(bounds.x, Math.min(result.x, bounds.x + bounds.width - result.width));
	result.y = Math.max(bounds.y, Math.min(result.y, bounds.y + bounds.height - result.height));

	return result;
}
 
Example #6
Source File: BreadcrumbItemDropDown.java    From Eclipse-Postfix-Code-Completion with Eclipse Public License 1.0 6 votes vote down vote up
/**
 * Returns the monitor whose client area contains the given point. If no monitor contains the
 * point, returns the monitor that is closest to the point.
 * <p>
 * Copied from <code>org.eclipse.jface.window.Window.getClosestMonitor(Display, Point)</code>
 * </p>
 *
 * @param display the display showing the monitors
 * @param point point to find (display coordinates)
 * @return the monitor closest to the given point
 */
private static Monitor getClosestMonitor(Display display, Point point) {
	int closest= Integer.MAX_VALUE;

	Monitor[] monitors= display.getMonitors();
	Monitor result= monitors[0];

	for (int i= 0; i < monitors.length; i++) {
		Monitor current= monitors[i];

		Rectangle clientArea= current.getClientArea();

		if (clientArea.contains(point))
			return current;

		int distance= Geometry.distanceSquared(Geometry.centerPoint(clientArea), point);
		if (distance < closest) {
			closest= distance;
			result= current;
		}
	}

	return result;
}
 
Example #7
Source File: SWTUtil.java    From SWET with MIT License 6 votes vote down vote up
private static Rectangle getCurrentMonitorBounds(Display dsp) {
	Monitor monitor = dsp.getPrimaryMonitor();

	// Choose current Monitor
	Point cursor = dsp.getCursorLocation();
	Monitor[] monitors = dsp.getMonitors();
	for (Monitor mon : monitors) {
		Rectangle mbounds = mon.getBounds();
		if (mbounds.contains(cursor)) {
			monitor = mon;
			break;
		}
	}

	return monitor.getBounds();
}
 
Example #8
Source File: UIUtils.java    From n4js with Eclipse Public License 1.0 6 votes vote down vote up
/**
 * Returns the monitor whose client area contains the given point. If no monitor contains the point, returns the
 * monitor that is closest to the point.
 *
 * @param toSearch
 *            point to find (display coordinates).
 * @param toFind
 *            point to find (display coordinates).
 * @return the monitor closest to the given point.
 */
private static Monitor getClosestMonitor(final Display toSearch, final Point toFind) {
	int closest = Integer.MAX_VALUE;

	final Monitor[] monitors = toSearch.getMonitors();
	Monitor result = monitors[0];

	for (int index = 0; index < monitors.length; index++) {
		final Monitor current = monitors[index];

		final Rectangle clientArea = current.getClientArea();

		if (clientArea.contains(toFind)) {
			return current;
		}

		final int distance = Geometry.distanceSquared(Geometry.centerPoint(clientArea), toFind);
		if (distance < closest) {
			closest = distance;
			result = current;
		}
	}

	return result;
}
 
Example #9
Source File: UIUtils.java    From n4js with Eclipse Public License 1.0 6 votes vote down vote up
/**
 * Returns the initial location to use for the shell. The default implementation centers the shell horizontally (1/2
 * of the difference to the left and 1/2 to the right) and vertically (1/3 above and 2/3 below) relative to the
 * active workbench windows shell, or display bounds if there is no parent shell.
 *
 * @param shell
 *            the shell which initial location has to be calculated.
 * @param initialSize
 *            the initial size of the shell, as returned by <code>getInitialSize</code>.
 * @return the initial location of the shell
 */
public static Point getInitialLocation(final Shell shell, final Point initialSize) {
	final Composite parent = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();

	Monitor monitor = shell.getDisplay().getPrimaryMonitor();
	if (parent != null) {
		monitor = parent.getMonitor();
	}

	final Rectangle monitorBounds = monitor.getClientArea();
	Point centerPoint;
	if (parent != null) {
		centerPoint = Geometry.centerPoint(parent.getBounds());
	} else {
		centerPoint = Geometry.centerPoint(monitorBounds);
	}

	return new Point(centerPoint.x - (initialSize.x / 2), Math.max(
			monitorBounds.y, Math.min(centerPoint.y - (initialSize.y * 2 / 3),
					monitorBounds.y + monitorBounds.height - initialSize.y)));
}
 
Example #10
Source File: UIUtils.java    From n4js with Eclipse Public License 1.0 6 votes vote down vote up
/**
 * Given the desired position of the shell, this method returns an adjusted position such that the window is no
 * larger than its monitor, and does not extend beyond the edge of the monitor. This is used for computing the
 * initial window position via the parent shell, clients can use this as a utility method if they want to limit the
 * region in which the window may be moved.
 *
 * @param shell
 *            the shell which shell bounds is being calculated.
 * @param preferredSize
 *            the preferred position of the window.
 * @return a rectangle as close as possible to preferredSize that does not extend outside the monitor.
 */
public static Rectangle getConstrainedShellBounds(final Shell shell, final Point preferredSize) {

	final Point location = getInitialLocation(shell, preferredSize);
	final Rectangle result = new Rectangle(location.x, location.y, preferredSize.x, preferredSize.y);

	final Monitor monitor = getClosestMonitor(shell.getDisplay(), Geometry.centerPoint(result));

	final Rectangle bounds = monitor.getClientArea();

	if (result.height > bounds.height) {
		result.height = bounds.height;
	}

	if (result.width > bounds.width) {
		result.width = bounds.width;
	}

	result.x = Math.max(bounds.x, Math.min(result.x, bounds.x
			+ bounds.width - result.width));
	result.y = Math.max(bounds.y, Math.min(result.y, bounds.y
			+ bounds.height - result.height));

	return result;
}
 
Example #11
Source File: MainSplash.java    From arx with Apache License 2.0 6 votes vote down vote up
/**
 * Creates a new instance.
 *
 * @param display
 * @param monitor
 */
public MainSplash(Display display, Monitor monitor) {
    
    this.version = ARXAnonymizer.VERSION;
    this.splash = Resources.getSplash(display);
    this.shell = new Shell(SWT.ON_TOP | (isMac() ? 0 : SWT.NO_TRIM));
    this.shell.setImages(Resources.getIconSet(display));
    this.shell.setSize(splash.getBounds().width, splash.getBounds().height);
    
    // Center
    SWTUtil.center(shell, monitor);
    
    // Paint
    shell.addPaintListener(new PaintListener(){
        public void paintControl(PaintEvent arg0) {
            paint(arg0.gc);
        }
    });
}
 
Example #12
Source File: DataOverrideHandler.java    From pentaho-kettle with Apache License 2.0 6 votes vote down vote up
private Shell getCenteredShell( Shell shell ) {
  Rectangle shellBounds = shell.getBounds();
  Monitor monitor = shell.getDisplay().getPrimaryMonitor();

  if ( shell.getParent() != null ) {
    monitor = shell.getParent().getMonitor();
  }

  Rectangle monitorClientArea = monitor.getClientArea();

  int middleX = monitorClientArea.x + ( monitorClientArea.width - shellBounds.width ) / 2;
  int middleY = monitorClientArea.y + ( monitorClientArea.height - shellBounds.height ) / 2;

  shell.setLocation( middleX, middleY );

  return shell;
}
 
Example #13
Source File: WindowProperty.java    From hop with Apache License 2.0 6 votes vote down vote up
/**
 * This method is needed in the case where the display has multiple monitors, but they do not form a uniform
 * rectangle. In this case, it is possible for Geometry.moveInside() to not detect that the window is partially or
 * completely clipped. We check to make sure at least the upper left portion of the rectangle is visible to give the
 * user the ability to reposition the dialog in this rare case.
 *
 * @param constrainee
 * @param display
 * @return
 */
private boolean isClippedByUnalignedMonitors( Rectangle constrainee, Display display ) {
  boolean isClipped;
  Monitor[] monitors = display.getMonitors();
  if ( monitors.length > 0 ) {
    // Loop searches for a monitor proving false
    isClipped = true;
    for ( Monitor monitor : monitors ) {
      if ( monitor.getClientArea().contains( constrainee.x + 10, constrainee.y + 10 ) ) {
        isClipped = false;
        break;
      }
    }
  } else {
    isClipped = false;
  }

  return isClipped;
}
 
Example #14
Source File: WindowProperty.java    From pentaho-kettle with Apache License 2.0 6 votes vote down vote up
/**
 * This method is needed in the case where the display has multiple monitors, but they do not form a uniform
 * rectangle. In this case, it is possible for Geometry.moveInside() to not detect that the window is partially or
 * completely clipped. We check to make sure at least the upper left portion of the rectangle is visible to give the
 * user the ability to reposition the dialog in this rare case.
 *
 * @param constrainee
 * @param display
 * @return
 */
private boolean isClippedByUnalignedMonitors( Rectangle constrainee, Display display ) {
  boolean isClipped;
  Monitor[] monitors = display.getMonitors();
  if ( monitors.length > 0 ) {
    // Loop searches for a monitor proving false
    isClipped = true;
    for ( Monitor monitor : monitors ) {
      if ( monitor.getClientArea().contains( constrainee.x + 10, constrainee.y + 10 ) ) {
        isClipped = false;
        break;
      }
    }
  } else {
    isClipped = false;
  }

  return isClipped;
}
 
Example #15
Source File: UIHelper.java    From birt with Eclipse Public License 1.0 5 votes vote down vote up
/**
 * Center shell on specified monitor.
 * 
 * @param monitor specified monitor will display shell.
 * @param shell the shell to be centered on monitor.
 */
public static void centerOnMonitor( Monitor monitor, Shell shell) {
	
	Rectangle clientArea = monitor.getClientArea();
	shell.setLocation( clientArea.x + ( clientArea.width / 2 ) - ( shell.getSize( ).x / 2 ),
			clientArea.y + ( clientArea.height / 2 ) - ( shell.getSize( ).y / 2 ) );
}
 
Example #16
Source File: SWTUtil.java    From arx with Apache License 2.0 5 votes vote down vote up
/**
 * Centers the shell on the given monitor.
 *
 * @param shell
 * @param monitor
 */
public static void center(Shell shell, Monitor monitor) {
    Rectangle shellRect = shell.getBounds();
    Rectangle displayRect = monitor.getBounds();
    int x = (displayRect.width - shellRect.width) / 2;
    int y = (displayRect.height - shellRect.height) / 2;
    shell.setLocation(displayRect.x + x, displayRect.y + y);
}
 
Example #17
Source File: BreadcrumbItemDropDown.java    From birt with Eclipse Public License 1.0 5 votes vote down vote up
/**
 * Returns the monitor whose client area contains the given point. If no
 * monitor contains the point, returns the monitor that is closest to the
 * point.
 * <p>
 * Copied from
 * <code>org.eclipse.jface.window.Window.getClosestMonitor(Display, Point)</code>
 * </p>
 * 
 * @param display
 *            the display showing the monitors
 * @param point
 *            point to find (display coordinates)
 * @return the monitor closest to the given point
 */
private static Monitor getClosestMonitor( Display display, Point point )
{
	int closest = Integer.MAX_VALUE;

	Monitor[] monitors = display.getMonitors( );
	Monitor result = monitors[0];

	for ( int i = 0; i < monitors.length; i++ )
	{
		Monitor current = monitors[i];

		Rectangle clientArea = current.getClientArea( );

		if ( clientArea.contains( point ) )
			return current;

		int distance = Geometry.distanceSquared( Geometry.centerPoint( clientArea ),
				point );
		if ( distance < closest )
		{
			closest = distance;
			result = current;
		}
	}

	return result;
}
 
Example #18
Source File: JframeApp.java    From jframe with Apache License 2.0 5 votes vote down vote up
public void layout2Center() {
    Monitor primary = shell.getDisplay().getPrimaryMonitor();
    Rectangle bounds = primary.getBounds();
    Rectangle rect = shell.getBounds();
    int x = bounds.x + (bounds.width - rect.width) / 2;
    int y = bounds.y + (bounds.height - rect.height) / 2;
    shell.setLocation(x, y);
}
 
Example #19
Source File: ProjectOptionsDataPage.java    From developer-studio with Apache License 2.0 5 votes vote down vote up
private void setShellLoc(Shell shell) {
	Monitor primary = Display.getCurrent().getPrimaryMonitor();
    Rectangle bounds = primary.getBounds();
    Rectangle rect = shell.getBounds();
    
    int x = bounds.x + (bounds.width - rect.width) / 2;
    int y = bounds.y + (bounds.height - rect.height) / 2;
    
    shell.setLocation(x, y);
	
}
 
Example #20
Source File: Main.java    From arx with Apache License 2.0 5 votes vote down vote up
/**
 * Returns the monitor on which the application was launched.
 *
 * @param display
 * @return
 */
private static Monitor getMonitor(Display display) {
    Point mouse = display.getCursorLocation();
    for (Monitor monitor : display.getMonitors()) {
        if (monitor.getBounds().contains(mouse)) {
            return monitor;
        }
    }
    return display.getPrimaryMonitor();
}
 
Example #21
Source File: BaseTransformDialog.java    From hop with Apache License 2.0 5 votes vote down vote up
/**
 * Sets the size of this dialog with respect to the given parameters.
 *
 * @param shell     the shell
 * @param minWidth  the minimum width
 * @param minHeight the minimum height
 * @param packIt    true to pack the dialog components, false otherwise
 */
public static void setSize( Shell shell, int minWidth, int minHeight, boolean packIt ) {
  PropsUi props = PropsUi.getInstance();

  WindowProperty winprop = props.getScreen( shell.getText() );
  if ( winprop != null ) {
    winprop.setShell( shell, minWidth, minHeight );
  } else {
    if ( packIt ) {
      shell.pack();
    } else {
      shell.layout();
    }

    // OK, sometimes this produces dialogs that are waay too big.
    // Try to limit this a bit, m'kay?
    // Use the same algorithm by cheating :-)
    //
    winprop = new WindowProperty( shell );
    winprop.setShell( shell, minWidth, minHeight );

    // Now, as this is the first time it gets opened, try to put it in the middle of the screen...
    Rectangle shellBounds = shell.getBounds();
    Monitor monitor = shell.getDisplay().getPrimaryMonitor();
    if ( shell.getParent() != null ) {
      monitor = shell.getParent().getMonitor();
    }
    Rectangle monitorClientArea = monitor.getClientArea();

    int middleX = monitorClientArea.x + ( monitorClientArea.width - shellBounds.width ) / 2;
    int middleY = monitorClientArea.y + ( monitorClientArea.height - shellBounds.height ) / 2;

    shell.setLocation( middleX, middleY );
  }
}
 
Example #22
Source File: SelectExamplePage.java    From statecharts with Eclipse Public License 1.0 5 votes vote down vote up
private Rectangle calculatePosition(int scale, int offset) {
	Monitor monitor = getMonitor();
	offset = offset * scale;
	int width = (monitor.getBounds().width + offset) / scale;
	int height = (monitor.getBounds().height + offset) / scale;
	int x = monitor.getBounds().x + (width - offset) / scale;
	int y = monitor.getBounds().y + (height - offset) / scale;
	return new Rectangle(x, y, width, height);
}
 
Example #23
Source File: MainView.java    From Universal-FE-Randomizer with MIT License 5 votes vote down vote up
public MainView(Display mainDisplay) {
	super();
	
	Shell shell = new Shell(mainDisplay, SWT.SHELL_TRIM & ~SWT.MAX); 
	 shell.setText("Yune: A Universal Fire Emblem Randomizer (v0.9.1)");
	 shell.setImage(new Image(mainDisplay, Main.class.getClassLoader().getResourceAsStream("YuneIcon.png")));
	 
	 screenHeight = mainDisplay.getBounds().height;
	 for (Monitor monitor : mainDisplay.getMonitors()) {
		 screenHeight = Math.max(screenHeight, monitor.getClientArea().height);
	 }
	 
	 screenHeight -= 20;
	 
	 mainShell = shell;
	 
	 setupMainShell();
	 
	 resize();
	 
	 /* Open shell window */
	  mainShell.open();
	  
	  mainDisplay.addFilter(SWT.KeyDown, new Listener() {
		@Override
		public void handleEvent(Event event) {
			if (((event.stateMask & SWT.CTRL) != 0) && ((event.stateMask & SWT.SHIFT) != 0) && (event.keyCode == 'c') && !consoleShellOpened) {
				openConsole();
			}
		}
	  });
}
 
Example #24
Source File: SWTGraphicUtil.java    From nebula with Eclipse Public License 2.0 5 votes vote down vote up
/**
 * Center a shell on the primary monitor
 *
 * @param shell shell to center
 */
public static void centerShell(final Shell shell) {
	final Monitor primary = shell.getDisplay().getPrimaryMonitor();
	final Rectangle bounds = primary.getBounds();
	final Rectangle rect = shell.getBounds();
	final int x = bounds.x + (bounds.width - rect.width) / 2;
	final int y = bounds.y + (bounds.height - rect.height) / 2;
	shell.setLocation(x, y);
}
 
Example #25
Source File: AbstractPopup.java    From workspacemechanic with Eclipse Public License 1.0 5 votes vote down vote up
private void setPosition(Shell shell) {
  Monitor monitor = selectMonitor(display);
  if (monitor != null) {
    Rectangle clientArea = monitor.getClientArea();
    Point size = shell.getSize();
    int x = (clientArea.x + clientArea.width - size.x) - 2;
    int y = (clientArea.y + clientArea.height - size.y) - 2;
    shell.setLocation(x, y);
  }
}
 
Example #26
Source File: AbstractPopup.java    From workspacemechanic with Eclipse Public License 1.0 5 votes vote down vote up
private Monitor selectMonitor(Display display) {
  Shell activeShell = display.getActiveShell();
  if (activeShell != null && activeShell.getMonitor() != null) {
    return activeShell.getMonitor();
  }

  // Fall-back
  Monitor[] monitors = display.getMonitors();
  if (monitors.length > 0) {
    return monitors[0];
  }

  // Worst case. What? Can this happen?
  return null;
}
 
Example #27
Source File: SWTGraphicUtil.java    From nebula with Eclipse Public License 2.0 5 votes vote down vote up
/**
 * @param shell
 * @return the bounds of the monitor on which the shell is running
 */
public static Rectangle getBoundsOfMonitorOnWhichShellIsDisplayed(final Shell shell) {
	Monitor monitor = shell.getDisplay().getPrimaryMonitor();
	if(shell != null && shell.getMonitor() != null) {
		monitor = shell.getMonitor();
	} 
	
	return monitor.getBounds();
}
 
Example #28
Source File: ScrolledTextEx.java    From SWET with MIT License 5 votes vote down vote up
private static Point center(Display display, Shell shell) {
	Monitor primary = display.getPrimaryMonitor();
	Rectangle bounds = primary.getBounds();
	Rectangle rect = shell.getBounds();

	int x = bounds.x + (bounds.width - rect.width) / 2;
	int y = bounds.y + (bounds.height - rect.height) / 2;

	Point location = new Point(x, y);
	return location;
}
 
Example #29
Source File: Utils.java    From nebula with Eclipse Public License 2.0 5 votes vote down vote up
/**
 * Centers a dialog (Shell) on the <b>primary</b> (active) display.
 * 
 * @param shell Shell to center on screen
 * @see Shell
 */
public static void centerDialogOnScreen(final Shell shell) {
	// do it by monitor to support dual-head cards and still center things correctly onto the screen people are on.
    final Monitor monitor = Display.getDefault().getPrimaryMonitor();
    final Rectangle bounds = monitor.getBounds();

    final int screen_x = bounds.width;
    final int screen_y = bounds.height;

	shell.setLocation(screen_x / 2 - (shell.getBounds().width / 2), screen_y / 2 - (shell.getBounds().height / 2));
}
 
Example #30
Source File: WindowProperty.java    From hop with Apache License 2.0 4 votes vote down vote up
/**
 * Performs calculations to size and position a dialog If the size passed in is too large for the primary monitor
 * client area, it is shrunk to fit. If the positioning leaves part of the dialog outside the client area, it is
 * centered instead.
 *
 * @param shell        The dialog to position and size
 * @param onlyPosition Unused argument. If the window is outside the viewable client are, it must be resized to prevent
 *                     inaccessibility.
 * @param minWidth
 * @param minHeight
 */
public void setShell( Shell shell, boolean onlyPosition, int minWidth, int minHeight ) {
  shell.setMaximized( maximized );
  shell.setBounds( new Rectangle(x, y, width, height) );

  if ( minWidth > 0 || minHeight > 0 ) {
    Rectangle bounds = shell.getBounds();
    if ( bounds.width < minWidth ) {
      bounds.width = minWidth;
    }
    if ( bounds.height < minHeight ) {
      bounds.height = minHeight;
    }
    shell.setSize( bounds.width, bounds.height );
  }

  // Just to double check: what is the preferred size of this dialog?
  // This computed is a minimum. If the minimum is smaller than the
  // size of the current shell, we make it larger.
  //
  Point computedSize = shell.computeSize( SWT.DEFAULT, SWT.DEFAULT );
  Rectangle shellSize = shell.getBounds();
  if ( shellSize.width < computedSize.x ) {
    shellSize.width = computedSize.x;
  }
  if ( shellSize.height < computedSize.y ) {
    shellSize.height = computedSize.y;
  }
  shell.setBounds( shellSize );

  Rectangle entireClientArea = shell.getDisplay().getClientArea();
  Rectangle resizedRect = Geometry.copy( shellSize );
  constrainRectangleToContainer( resizedRect, entireClientArea );

  // If the persisted size/location doesn't perfectly fit
  // into the entire client area, the persisted settings
  // likely were not meant for this configuration of monitors.
  // Relocate the shell into either the parent monitor or if
  // there is no parent, the primary monitor then center it.
  //
  if ( !resizedRect.equals( shellSize ) || isClippedByUnalignedMonitors( resizedRect, shell.getDisplay() ) ) {
    Monitor monitor = shell.getDisplay().getPrimaryMonitor();
    if ( shell.getParent() != null ) {
      monitor = shell.getParent().getMonitor();
    }
    Rectangle monitorClientArea = monitor.getClientArea();
    constrainRectangleToContainer( resizedRect, monitorClientArea );

    resizedRect.x = monitorClientArea.x + ( monitorClientArea.width - resizedRect.width ) / 2;
    resizedRect.y = monitorClientArea.y + ( monitorClientArea.height - resizedRect.height ) / 2;

    shell.setBounds( resizedRect );
  }
}