summaryrefslogtreecommitdiff
path: root/propertysheet/src/org/eclipse/wb/internal/core/utils/ui/dialogs
diff options
context:
space:
mode:
authorTor Norbye <tnorbye@google.com>2012-04-05 12:25:53 -0700
committerandroid code review <noreply-gerritcodereview@google.com>2012-04-05 12:25:55 -0700
commit710a161c9c528b5e5cb5cd6d0d41736881c9697f (patch)
treec56a08ff179924eff51f0020fe530c8fd895406b /propertysheet/src/org/eclipse/wb/internal/core/utils/ui/dialogs
parentb33fa4c8ce6b3d2c10eaa92c5c26019d7326bd4c (diff)
parent765e52e2d30d0754625b8c7af6c36e93612f15be (diff)
downloadeclipse-windowbuilder-710a161c9c528b5e5cb5cd6d0d41736881c9697f.tar.gz
Merge "Add WindowBuilder propertysheet code. See README.txt for details."
Diffstat (limited to 'propertysheet/src/org/eclipse/wb/internal/core/utils/ui/dialogs')
-rw-r--r--propertysheet/src/org/eclipse/wb/internal/core/utils/ui/dialogs/ResizableDialog.java221
-rw-r--r--propertysheet/src/org/eclipse/wb/internal/core/utils/ui/dialogs/StringsDialog.java77
-rw-r--r--propertysheet/src/org/eclipse/wb/internal/core/utils/ui/dialogs/TextDialog.java118
3 files changed, 416 insertions, 0 deletions
diff --git a/propertysheet/src/org/eclipse/wb/internal/core/utils/ui/dialogs/ResizableDialog.java b/propertysheet/src/org/eclipse/wb/internal/core/utils/ui/dialogs/ResizableDialog.java
new file mode 100644
index 0000000..307c2f6
--- /dev/null
+++ b/propertysheet/src/org/eclipse/wb/internal/core/utils/ui/dialogs/ResizableDialog.java
@@ -0,0 +1,221 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Google, Inc.
+ * 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:
+ * Google, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wb.internal.core.utils.ui.dialogs;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.ControlListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+/**
+ * {@link Dialog} that remembers location/size between usage sessions.
+ *
+ * @author scheglov_ke
+ * @coverage core.ui
+ */
+public abstract class ResizableDialog extends Dialog {
+ /**
+ * Key for accessing {@link Dialog} from its {@link Shell}.
+ */
+ public static final String KEY_DIALOG = "KEY_DIALOG";
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // Internal constants
+ //
+ ////////////////////////////////////////////////////////////////////////////
+ private static final String X = "x";
+ private static final String Y = "y";
+ private static final String WIDTH = "width";
+ private static final String HEIGHT = "height";
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // Instance fields
+ //
+ ////////////////////////////////////////////////////////////////////////////
+ private final AbstractUIPlugin m_plugin;
+
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // Constructor
+ //
+ ////////////////////////////////////////////////////////////////////////////
+ public ResizableDialog(Shell parentShell, AbstractUIPlugin plugin) {
+ super(parentShell);
+ m_plugin = plugin;
+ setShellStyle(getShellStyle() | SWT.RESIZE | SWT.MAX);
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // Size
+ //
+ ////////////////////////////////////////////////////////////////////////////
+ @Override
+ protected Point getInitialSize() {
+ // track the current dialog bounds
+ installDialogBoundsTracker();
+ // answer the size from the previous incarnation
+ Point defaultSize = getDefaultSize();
+ if ((getShellStyle() & SWT.RESIZE) != 0) {
+ Rectangle oldBounds = loadBounds();
+ if (oldBounds != null) {
+ Rectangle displayBounds = getShell().getDisplay().getBounds();
+ int width = Math.min(displayBounds.width, Math.max(oldBounds.width, defaultSize.x));
+ int height = Math.min(displayBounds.height, Math.max(oldBounds.height, defaultSize.y));
+ return new Point(width, height);
+ }
+ }
+ // use default size
+ return defaultSize;
+ }
+
+ /**
+ * @return the default size of dialog.
+ */
+ protected Point getDefaultSize() {
+ return super.getInitialSize();
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // Location
+ //
+ ////////////////////////////////////////////////////////////////////////////
+ @Override
+ protected Point getInitialLocation(Point initialSize) {
+ Rectangle windowBounds;
+ {
+ Shell windowShell = m_plugin.getWorkbench().getActiveWorkbenchWindow().getShell();
+ windowBounds = windowShell.getBounds();
+ }
+ // answer the location from the previous incarnation
+ Rectangle bounds = loadBounds();
+ if (bounds != null) {
+ int x = bounds.x;
+ int y = bounds.y;
+ int maxX = windowBounds.x + windowBounds.width - initialSize.x;
+ int maxY = windowBounds.y + windowBounds.height - initialSize.y;
+ if (x > maxX) {
+ x = maxX;
+ }
+ if (y > maxY) {
+ y = maxY;
+ }
+ if (x < windowBounds.x) {
+ x = windowBounds.x;
+ }
+ if (y < windowBounds.y) {
+ y = windowBounds.y;
+ }
+ return new Point(x, y);
+ }
+ // default location - centered on workbench window
+ int x = windowBounds.x + (windowBounds.width - initialSize.x) / 2;
+ int y = windowBounds.y + (windowBounds.height - initialSize.y) / 2;
+ return new Point(x, y);
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // Bounds
+ //
+ ////////////////////////////////////////////////////////////////////////////
+ /**
+ * Loads bounds from {@link IDialogSettings}.
+ */
+ private Rectangle loadBounds() {
+ IDialogSettings settings = getDialogSettings();
+ try {
+ return new Rectangle(settings.getInt(X),
+ settings.getInt(Y),
+ settings.getInt(WIDTH),
+ settings.getInt(HEIGHT));
+ } catch (NumberFormatException e) {
+ return null;
+ }
+ }
+
+ /**
+ * Saves bounds to {@link IDialogSettings}.
+ */
+ private void saveBounds(Rectangle bounds) {
+ IDialogSettings settings = getDialogSettings();
+ settings.put(X, bounds.x);
+ settings.put(Y, bounds.y);
+ settings.put(WIDTH, bounds.width);
+ settings.put(HEIGHT, bounds.height);
+ }
+
+ /**
+ * @return the {@link IDialogSettings} for this dialog with this type.
+ */
+ protected IDialogSettings getDialogSettings() {
+ IDialogSettings settings = m_plugin.getDialogSettings();
+ String sectionName = getDialogSettingsSectionName();
+ if (settings.getSection(sectionName) == null) {
+ return settings.addNewSection(sectionName);
+ }
+ return settings.getSection(sectionName);
+ }
+
+ /**
+ * @return the name of section for dialog specific bounds. By default uses name of {@link Class},
+ * but if same dialog is used for displaying different content, then may be overridden.
+ */
+ protected String getDialogSettingsSectionName() {
+ return getClass().getName();
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // Size tracking
+ //
+ ////////////////////////////////////////////////////////////////////////////
+ protected Rectangle cachedBounds;
+
+ private void installDialogBoundsTracker() {
+ getShell().addControlListener(new ControlListener() {
+ public void controlMoved(ControlEvent e) {
+ cachedBounds = getShell().getBounds();
+ }
+
+ public void controlResized(ControlEvent e) {
+ cachedBounds = getShell().getBounds();
+ }
+ });
+ }
+
+ @Override
+ public boolean close() {
+ boolean shellMaximized = getShell().getMaximized();
+ boolean closed = super.close();
+ if (closed && !shellMaximized && cachedBounds != null) {
+ saveBounds(cachedBounds);
+ }
+ return closed;
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // Shell
+ //
+ ////////////////////////////////////////////////////////////////////////////
+ @Override
+ protected void configureShell(Shell newShell) {
+ super.configureShell(newShell);
+ newShell.setData(KEY_DIALOG, this);
+ }
+}
diff --git a/propertysheet/src/org/eclipse/wb/internal/core/utils/ui/dialogs/StringsDialog.java b/propertysheet/src/org/eclipse/wb/internal/core/utils/ui/dialogs/StringsDialog.java
new file mode 100644
index 0000000..745bcc3
--- /dev/null
+++ b/propertysheet/src/org/eclipse/wb/internal/core/utils/ui/dialogs/StringsDialog.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Google, Inc.
+ * 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:
+ * Google, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wb.internal.core.utils.ui.dialogs;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.Lists;
+
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.wb.internal.core.utils.execution.ExecutionUtils;
+import org.eclipse.wb.internal.core.utils.execution.RunnableObjectEx;
+
+import java.io.BufferedReader;
+import java.io.StringReader;
+import java.util.List;
+
+/**
+ * The dialog for editing array of {@link String}'s.
+ *
+ * @author scheglov_ke
+ * @coverage core.ui
+ */
+public class StringsDialog extends TextDialog {
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // Constructor
+ //
+ ////////////////////////////////////////////////////////////////////////////
+ public StringsDialog(Shell parentShell,
+ AbstractUIPlugin plugin,
+ String titleText,
+ String headerText,
+ String footerText) {
+ super(parentShell, plugin, titleText, headerText, footerText);
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // Items
+ //
+ ////////////////////////////////////////////////////////////////////////////
+ /**
+ * Sets the items to edit.
+ */
+ public void setItems(String[] items) {
+ setText(Joiner.on('\n').join(items));
+ }
+
+ /**
+ * @return the edited items.
+ */
+ public String[] getItems() {
+ return ExecutionUtils.runObjectLog(new RunnableObjectEx<String[]>() {
+ @Override
+ public String[] runObject() throws Exception {
+ List<String> strings = Lists.newArrayList();
+ BufferedReader br = new BufferedReader(new StringReader(getText()));
+ while (true) {
+ String s = br.readLine();
+ if (s == null) {
+ break;
+ }
+ strings.add(s);
+ }
+ return strings.toArray(new String[strings.size()]);
+ }
+ }, new String[0]);
+ }
+}
diff --git a/propertysheet/src/org/eclipse/wb/internal/core/utils/ui/dialogs/TextDialog.java b/propertysheet/src/org/eclipse/wb/internal/core/utils/ui/dialogs/TextDialog.java
new file mode 100644
index 0000000..320fa32
--- /dev/null
+++ b/propertysheet/src/org/eclipse/wb/internal/core/utils/ui/dialogs/TextDialog.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Google, Inc.
+ * 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:
+ * Google, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wb.internal.core.utils.ui.dialogs;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.wb.internal.core.utils.ui.GridDataFactory;
+import org.eclipse.wb.internal.core.utils.ui.GridLayoutFactory;
+
+/**
+ * The dialog for editing multiline text.
+ *
+ * @author scheglov_ke
+ * @coverage core.ui
+ */
+public class TextDialog extends ResizableDialog {
+ private final String m_titleText;
+ private final String m_headerText;
+ private final String m_footerText;
+
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // Constructor
+ //
+ ////////////////////////////////////////////////////////////////////////////
+ public TextDialog(Shell parentShell,
+ AbstractUIPlugin plugin,
+ String titleText,
+ String headerText,
+ String footerText) {
+ super(parentShell, plugin);
+ m_titleText = titleText;
+ m_headerText = headerText;
+ m_footerText = footerText;
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // Text
+ //
+ ////////////////////////////////////////////////////////////////////////////
+ private String m_text;
+
+ /**
+ * Sets the text to edit.
+ */
+ public final void setText(String text) {
+ m_text = text;
+ }
+
+ /**
+ * @return the edited text.
+ */
+ public final String getText() {
+ return m_text;
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // GUI
+ //
+ ////////////////////////////////////////////////////////////////////////////
+ protected Text m_textWidget;
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite area = (Composite) super.createDialogArea(parent);
+ GridLayoutFactory.create(area);
+ // header
+ new Label(area, SWT.NONE).setText(m_headerText);
+ // Text widget
+ {
+ m_textWidget = new Text(area, SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+ GridDataFactory.create(m_textWidget).grab().fill().hintVC(10);
+ m_textWidget.setText(m_text);
+ // handle Ctrl+Enter as OK
+ m_textWidget.addKeyListener(new KeyAdapter() {
+ @Override
+ public void keyPressed(KeyEvent e) {
+ if (e.stateMask == SWT.CTRL && e.keyCode == SWT.CR) {
+ okPressed();
+ }
+ }
+ });
+ }
+ // footer
+ new Label(area, SWT.NONE).setText(m_footerText);
+ //
+ return area;
+ }
+
+ @Override
+ protected void configureShell(Shell newShell) {
+ super.configureShell(newShell);
+ newShell.setText(m_titleText);
+ }
+
+ @Override
+ protected void okPressed() {
+ m_text = m_textWidget.getText();
+ super.okPressed();
+ }
+}