Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: e4120dd0f1d81f0ce4b2588d6184fce1a6b394d7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/*******************************************************************************
 * Copyright (c) 2000, 2008 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.compare.examples.xml;

import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Caret;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.ScrollBar;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Widget;

/**
 * Utility class to simplify access to some SWT resources. 
 */
public class SWTUtil {
	
	/*
	 * Returns the standard display to be used. The method first checks, if
	 * the thread calling this method has an associated disaply. If so, this
	 * display is returned. Otherwise the method returns the default display.
	 */
	public static Display getStandardDisplay() {
		Display display;
		display= Display.getCurrent();
		if (display == null)
			display= Display.getDefault();
		return display;		
	}
	
	/*
	 * Returns the shell for the given widget. If the widget doesn't represent
	 * a SWT object that manage a shell, <code>null</code> is returned.
	 * 
	 * @return the shell for the given widget
	 */
	public static Shell getShell(Widget widget) {
		if (widget instanceof Control)
			return ((Control)widget).getShell();
		if (widget instanceof Caret)
			return ((Caret)widget).getParent().getShell();
		if (widget instanceof DragSource)
			return ((DragSource)widget).getControl().getShell();
		if (widget instanceof DropTarget)
			return ((DropTarget)widget).getControl().getShell();
		if (widget instanceof Menu)
			return ((Menu)widget).getParent().getShell();
		if (widget instanceof ScrollBar)
			return ((ScrollBar)widget).getParent().getShell();			
		return null;	
	}
	
	private static double getVerticalDialogUnitSize(Control control) {
		GC gc= new GC(control);
		try {
			int height = gc.getFontMetrics().getHeight();
			return height * 0.125;
		} finally {
			gc.dispose();
		}
	}
	
	private static double getHorizontalDialogUnitSize(Control control) {
		GC gc= new GC(control);
		try {
			int averageWidth= gc.getFontMetrics().getAverageCharWidth();
			return averageWidth * 0.25;
		} finally {
			gc.dispose();
		}
	}	
	
	public static int convertHeightInCharsToPixels(int chars, Control control) {
		return convertVerticalDLUsToPixels(chars * 8, control);
	}

	public static int convertHorizontalDLUsToPixels(int dlus, Control control) {
		return (int)Math.round(dlus * getHorizontalDialogUnitSize(control));
	}

	public static int convertVerticalDLUsToPixels(int dlus, Control control) {
		return (int)Math.round(dlus * getVerticalDialogUnitSize(control));
	}
	
	public static int convertWidthInCharsToPixels(int chars, Control control) {
		return convertHorizontalDLUsToPixels(chars * 4, control);
	}
	
	/*
	 * Returns a width hint for a button control.
	 */
	public static int getButtonWidthHint(Button button) {
		int widthHint= convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH, button);
		return Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
	}

	/*
	 * Returns a height hint for a button control.
	 */		
//	public static int getButtonHeigthHint(Button button) {
//		return convertVerticalDLUsToPixels(IDialogConstants.BUTTON_HEIGHT, button);
//	}		

	/*
	 * Sets width and height hint for the button control.
	 * <b>Note:</b> This is a NOP if the button's layout data is not
	 * an instance of <code>GridData</code>.
	 * 
	 * @param	the button for which to set the dimension hint
	 */		
	public static void setButtonDimensionHint(Button button) {
		Assert.isNotNull(button);
		Object gd= button.getLayoutData();
		if (gd instanceof GridData) {
			//((GridData)gd).heightHint= getButtonHeigthHint(button);
			((GridData)gd).widthHint= getButtonWidthHint(button);		 
		}
	}
}

Back to the top