Implement MultiLineInputDialog for Add Bookmark action.
authorPatrick Tasse <patrick.tasse@gmail.com>
Fri, 9 Nov 2012 22:38:56 +0000 (17:38 -0500)
committerPatrick Tasse <patrick.tasse@gmail.com>
Mon, 12 Nov 2012 16:10:15 +0000 (11:10 -0500)
Supports multiple line description.
Tool tip position calculation is corrected.

Change-Id: I1bf7fc4b32a507b90475f321a054ee4ab7ced823
Reviewed-on: https://git.eclipse.org/r/8615
Tested-by: Hudson CI
Reviewed-by: Patrick Tasse <patrick.tasse@gmail.com>
IP-Clean: Patrick Tasse <patrick.tasse@gmail.com>

org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/Messages.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/dialogs/MultiLineInputDialog.java [new file with mode: 0644]
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/messages.properties
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/viewers/events/TmfEventsTable.java

index 29e10702f3ad4ef907c5b3b851e6ef9054bfd3d7..1e9ce0c9b67769641fda8901ca34d47e25e904d2 100644 (file)
@@ -50,7 +50,7 @@ public class Messages extends NLS {
     public static String CustomXmlTraceDefinition_timestampOutputFormat;
 
     public static String TmfEventsTable_AddBookmarkActionText;
-    public static String TmfEventsTable_AddBookmarkDialogText;
+    public static String TmfEventsTable_AddBookmarkDialogMessage;
     public static String TmfEventsTable_AddBookmarkDialogTitle;
     public static String TmfEventsTable_ApplyPresetFilterMenuName;
     public static String TmfEventsTable_ClearFiltersActionText;
diff --git a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/dialogs/MultiLineInputDialog.java b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/dialogs/MultiLineInputDialog.java
new file mode 100644 (file)
index 0000000..3cee15a
--- /dev/null
@@ -0,0 +1,180 @@
+/*******************************************************************************
+ * Copyright (c) 2012 Ericsson
+ *
+ * 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:
+ *   Patrick Tasse - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.internal.tmf.ui.dialogs;
+
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.IInputValidator;
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.GridData;
+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;
+
+/**
+ * A simple input dialog for soliciting an input string from the user.
+ *
+ * Overrides InputDialog to support multiple line text input.
+ *
+ * @author Patrick Tasse
+ *
+ */
+public class MultiLineInputDialog extends InputDialog {
+
+    private final String dialogMessage;
+
+    /* flag to indicate if CR can be used to submit the dialog */
+    private boolean submitOnCR = true;
+
+    /**
+     * Creates a multi line input dialog.
+     *
+     * @param parentShell
+     *            the parent shell, or <code>null</code> to create a top-level shell
+     * @param dialogTitle
+     *            the dialog title, or <code>null</code> if none
+     * @param dialogMessage
+     *            the dialog message, or <code>null</code> if none
+     * @param initialValue
+     *            the initial input value, or <code>null</code> if none (equivalent to the empty string)
+     * @param validator
+     *            an input validator, or <code>null</code> if none
+     */
+    public MultiLineInputDialog(Shell parentShell, String dialogTitle,
+            String dialogMessage, String initialValue, IInputValidator validator) {
+        super(parentShell, dialogTitle, null, initialValue, validator);
+        this.dialogMessage = dialogMessage;
+    }
+
+    /**
+     * Creates a multi line input dialog with a not-empty text validator.
+     *
+     * @param parentShell
+     *            the parent shell, or <code>null</code> to create a top-level shell
+     * @param dialogTitle
+     *            the dialog title, or <code>null</code> if none
+     * @param dialogMessage
+     *            the dialog message, or <code>null</code> if none
+     * @param initialValue
+     *            the initial input value, or <code>null</code> if none (equivalent to the empty string)
+     */
+    public MultiLineInputDialog(Shell parentShell, String dialogTitle,
+            String dialogMessage, String initialValue) {
+        super(parentShell, dialogTitle, null, initialValue, new NotEmptyValidator());
+        this.dialogMessage = dialogMessage;
+    }
+
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.dialogs.InputDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+     */
+    @Override
+    protected Control createDialogArea(Composite parent) {
+        Composite composite = (Composite) super.createDialogArea(parent);
+        final Text text = getText();
+
+        /* create dialog message label here instead because default implementation uses GRAB_VERTICAL */
+        if (dialogMessage != null) {
+            Label label = new Label(composite, SWT.WRAP);
+            label.setText(dialogMessage);
+            GridData data = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL
+                    | GridData.VERTICAL_ALIGN_CENTER);
+            data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);
+            label.setLayoutData(data);
+            label.setFont(parent.getFont());
+            label.moveAbove(text);
+        }
+
+        /* modify text layout data here because default implementation doesn't fill vertically */
+        GridData gridData = new GridData(GridData.FILL_BOTH);
+        gridData.widthHint = convertHorizontalDLUsToPixels(250);
+        gridData.heightHint = convertHeightInCharsToPixels(3);
+        text.setLayoutData(gridData);
+
+        text.addKeyListener(new KeyAdapter() {
+            @Override
+            public void keyPressed(KeyEvent e) {
+                if (e.character == SWT.CR) {
+                    if (submitOnCR) {
+                        /* submit the dialog */
+                        e.doit = false;
+                        okPressed();
+                        return;
+                    }
+                } else if (e.character == SWT.TAB) {
+                    /* don't insert a tab character in the text */
+                    e.doit = false;
+                    text.traverse(SWT.TRAVERSE_TAB_NEXT);
+                }
+                /* don't allow CR to submit anymore */
+                submitOnCR = false;
+            }
+        });
+
+        text.addMouseListener(new MouseAdapter() {
+            @Override
+            public void mouseDown(MouseEvent e) {
+                /* don't allow CR to submit anymore */
+                submitOnCR = false;
+            }
+        });
+
+        return composite;
+    }
+
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.dialogs.Dialog#createContents(org.eclipse.swt.widgets.Composite)
+     */
+    @Override
+    protected Control createContents(Composite parent) {
+        Control control = super.createContents(parent);
+
+        /* set the shell minimum size */
+        Point clientArea = control.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+        Rectangle trim = getShell().computeTrim(0, 0, clientArea.x, clientArea.y);
+        getShell().setMinimumSize(trim.width, trim.height);
+
+        return control;
+    }
+
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.dialogs.InputDialog#getInputTextStyle()
+     */
+    @Override
+    protected int getInputTextStyle() {
+        return SWT.MULTI | SWT.WRAP | SWT.V_SCROLL | SWT.BORDER;
+    }
+
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.dialogs.Dialog#isResizable()
+     */
+    @Override
+    protected boolean isResizable() {
+        return true;
+    }
+
+    private static class NotEmptyValidator implements IInputValidator {
+        @Override
+        public String isValid(String newText) {
+            return (newText == null || newText.trim().length() == 0) ? " " : null; //$NON-NLS-1$
+        }
+    }
+
+}
index 8ce842aad99d6b1e43d13a1914cdd7c85c597be6..f804e502f42fcba445086ca246ee227f8c6b77c1 100644 (file)
@@ -46,7 +46,7 @@ CustomXmlTraceDefinition_timestampOutputFormat=TimeStampOutputFormat
 
 # org.eclipse.linuxtools.tmf.ui.viewers.events
 TmfEventsTable_AddBookmarkActionText=Add Bookmark...
-TmfEventsTable_AddBookmarkDialogText=Enter Bookmark name:
+TmfEventsTable_AddBookmarkDialogMessage=Enter Bookmark description:
 TmfEventsTable_AddBookmarkDialogTitle=Add Bookmark
 TmfEventsTable_ApplyPresetFilterMenuName=Apply preset filter...
 TmfEventsTable_ClearFiltersActionText=Clear Filters
index a75425a37edbbdaaf830f78774e296bf209a5ad1..9e86e5197d596f88383c35d8ca486b812149b9e1 100644 (file)
@@ -48,12 +48,12 @@ import org.eclipse.jface.util.SafeRunnable;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.window.Window;
 import org.eclipse.linuxtools.internal.tmf.ui.Activator;
 import org.eclipse.linuxtools.internal.tmf.ui.Messages;
+import org.eclipse.linuxtools.internal.tmf.ui.dialogs.MultiLineInputDialog;
 import org.eclipse.linuxtools.tmf.core.component.ITmfDataProvider;
 import org.eclipse.linuxtools.tmf.core.component.TmfComponent;
 import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;
@@ -451,7 +451,7 @@ public class TmfEventsTable extends TmfComponent implements IGotoMarker,
                         }
                         Point pt = fTable.toDisplay(event.x, y);
                         pt.x += BOOKMARK_IMAGE.getBounds().width;
-                        pt.y += size.y;
+                        pt.y += item.getBounds().height;
                         tooltipShell.setBounds(pt.x, pt.y, size.x, size.y);
                         tooltipShell.setVisible(true);
                         break;
@@ -1704,9 +1704,11 @@ public class TmfEventsTable extends TmfComponent implements IGotoMarker,
                     }
                     defaultMessage.append(tableItem.getText(i));
                 }
-                final InputDialog dialog = new InputDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
-                        Messages.TmfEventsTable_AddBookmarkDialogTitle, Messages.TmfEventsTable_AddBookmarkDialogText,
-                        defaultMessage.toString(), null);
+                final InputDialog dialog = new MultiLineInputDialog(
+                        PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+                        Messages.TmfEventsTable_AddBookmarkDialogTitle,
+                        Messages.TmfEventsTable_AddBookmarkDialogMessage,
+                        defaultMessage.toString());
                 if (dialog.open() == Window.OK) {
                     final String message = dialog.getValue();
                     try {
This page took 0.028078 seconds and 5 git commands to generate.