Java tutorial
/* * Copyright (c) 2015 Eike Stepper (Berlin, Germany) 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: * Eike Stepper - initial API and implementation */ package org.eclipse.userstorage.ui; import org.eclipse.userstorage.internal.util.StringUtil; import org.eclipse.userstorage.ui.internal.Activator; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import java.lang.reflect.Field; /** * @author Eike Stepper */ public abstract class AbstractDialog extends TitleAreaDialog { private static final String DIALOG_WIDTH = getDialogConstant("DIALOG_WIDTH", "DIALOG_WIDTH"); private static final String DIALOG_HEIGHT = getDialogConstant("DIALOG_HEIGHT", "DIALOG_HEIGHT"); private static final String DIALOG_FONT_DATA = getDialogConstant("DIALOG_FONT_DATA", "DIALOG_FONT_NAME"); private static final String DIALOG_MESSAGE = "DIALOG_MESSAGE"; private static final int WIDTH_MIN = 350; private static final int WIDTH_MAX = 5000; private static final int WIDTH_INC1 = 250; private static final int WIDTH_INC2 = WIDTH_INC1 / 10; private static final Field messageLabelField; static { Field field = null; try { field = TitleAreaDialog.class.getDeclaredField("messageLabel"); field.setAccessible(true); } catch (Throwable ex) { field = null; } messageLabelField = field; } public AbstractDialog(Shell parentShell) { super(parentShell); setShellStyle(SWT.SHELL_TRIM | SWT.BORDER | SWT.APPLICATION_MODAL); } @Override public boolean close() { Shell shell = getShell(); if (shell != null && !shell.isDisposed()) { IDialogSettings settings = getDialogBoundsSettings(); if (settings != null) { String message = getMessage(); int strategy = getDialogBoundsStrategy(); if ((strategy & DIALOG_PERSISTSIZE) != 0) { settings.put(DIALOG_MESSAGE, message); } } } return super.close(); } protected IDialogSettings getPluginSettings() { return null; } protected String getDialogSettingsName() { return getClass().getSimpleName(); } @Override protected IDialogSettings getDialogBoundsSettings() { IDialogSettings settings = getPluginSettings(); if (settings == null) { return null; } String sectionName = getDialogSettingsName(); if (sectionName == null) { return null; } IDialogSettings section = settings.getSection(sectionName); if (section == null) { section = settings.addNewSection(sectionName); } return section; } @Override protected int getDialogBoundsStrategy() { return DIALOG_PERSISTSIZE; } @Override protected Point getInitialSize() { Shell shell = getShell(); Point result = shell.computeSize(SWT.DEFAULT, SWT.DEFAULT, true); Point minimum = getMinimumSize(); result.x = Math.max(result.x, minimum.x); result.y = Math.max(result.y, minimum.y); if ((getDialogBoundsStrategy() & DIALOG_PERSISTSIZE) != 0) { IDialogSettings settings = getDialogBoundsSettings(); if (settings != null) { if (hasSameFont(settings) && hasSameMessage(settings)) { try { int width = settings.getInt(DIALOG_WIDTH); if (width != DIALOG_DEFAULT_BOUNDS) { result.x = width; } } catch (NumberFormatException ex) { //$FALL-THROUGH$ } try { int height = settings.getInt(DIALOG_HEIGHT); if (height != DIALOG_DEFAULT_BOUNDS) { result.y = height; } } catch (NumberFormatException ex) { //$FALL-THROUGH$ } return result; } } } Text messageLabel; try { messageLabel = (Text) messageLabelField.get(this); } catch (Throwable ex) { return result; } String message = messageLabel.getText(); messageLabel.setText("\n\n"); int messageHeight = messageLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT).y; messageLabel.setText(message); result.x = WIDTH_MIN; while (result.x < WIDTH_MAX) { result.x += WIDTH_INC1; shell.setSize(result); Point messageSize = messageLabel.computeSize(messageLabel.getSize().x, SWT.DEFAULT); if (messageSize.y <= messageHeight) { break; } } result.x -= WIDTH_INC1; while (result.x < WIDTH_MAX) { result.x += WIDTH_INC2; shell.setSize(result); Point messageSize = messageLabel.computeSize(messageLabel.getSize().x, SWT.DEFAULT); if (messageSize.y <= messageHeight) { break; } } result = shell.computeSize(result.x + WIDTH_INC2, SWT.DEFAULT, true); return result; } protected Point getMinimumSize() { return new Point(WIDTH_MIN, 0); } @Override protected Control createDialogArea(Composite parent) { Shell shell = getShell(); ImageDescriptor descriptor = Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/LoginBanner.png"); final Image titleImage = descriptor.createImage(shell.getDisplay()); shell.addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(DisposeEvent e) { titleImage.dispose(); } }); setTitleImage(titleImage); return super.createDialogArea(parent); } private boolean hasSameFont(IDialogSettings settings) { String previousFontData = settings.get(DIALOG_FONT_DATA); if (StringUtil.isEmpty(previousFontData)) { return false; } FontData[] fontDatas = JFaceResources.getDialogFont().getFontData(); if (fontDatas.length == 0) { return false; } String currentFontData = fontDatas[0].toString(); return previousFontData.equalsIgnoreCase(currentFontData); } private boolean hasSameMessage(IDialogSettings settings) { String previousMessage = settings.get(DIALOG_MESSAGE); if (StringUtil.isEmpty(previousMessage)) { return false; } String currentMessage = getMessage(); return previousMessage.equals(currentMessage); } private static String getDialogConstant(String name, String defaultValue) { try { Field field = Dialog.class.getDeclaredField(name); field.setAccessible(true); return (String) field.get(null); } catch (Throwable ex) { //$FALL-THROUGH$ } return defaultValue; } }