]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - security/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/dialogs/DefaultLoginDialog.java
Internationalization support
[lgpl/argeo-commons.git] / security / plugins / org.argeo.security.ui / src / main / java / org / argeo / security / ui / dialogs / DefaultLoginDialog.java
index 8c8554c6b77a0ef8ff2700acc4590f190617a4ba..97340892d0c62eba0cfdc230bbe82d44fbba996d 100644 (file)
@@ -1,16 +1,37 @@
+/*
+ * Copyright (C) 2007-2012 Mathieu Baudier
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package org.argeo.security.ui.dialogs;
 
 import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
 import javax.security.auth.callback.NameCallback;
 import javax.security.auth.callback.PasswordCallback;
 import javax.security.auth.callback.TextOutputCallback;
 
+import org.argeo.util.LocaleCallback;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Display;
@@ -18,6 +39,7 @@ import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Text;
 
+/** Default authentication dialog, to be used as {@link CallbackHandler}. */
 public class DefaultLoginDialog extends AbstractLoginDialog {
 
        public DefaultLoginDialog() {
@@ -26,17 +48,27 @@ public class DefaultLoginDialog extends AbstractLoginDialog {
 
        protected DefaultLoginDialog(Shell parentShell) {
                super(parentShell);
-               // setBlockOnOpen(false);
        }
 
        protected Point getInitialSize() {
-               return new Point(300, 180);
+               return new Point(350, 180);
        }
 
        @Override
        protected Control createContents(Composite parent) {
                Control control = super.createContents(parent);
                parent.pack();
+
+               // Move the dialog to the center of the top level shell.
+               Rectangle shellBounds;
+               if (Display.getCurrent().getActiveShell() != null) // RCP
+                       shellBounds = Display.getCurrent().getActiveShell().getBounds();
+               else
+                       shellBounds = Display.getCurrent().getBounds();// RAP
+               Point dialogSize = parent.getSize();
+               int x = shellBounds.x + (shellBounds.width - dialogSize.x) / 2;
+               int y = shellBounds.y + (shellBounds.height - dialogSize.y) / 2;
+               parent.setLocation(x, y);
                return control;
        }
 
@@ -61,6 +93,8 @@ public class DefaultLoginDialog extends AbstractLoginDialog {
                                createNameHandler(composite, (NameCallback) callback);
                        } else if (callback instanceof PasswordCallback) {
                                createPasswordHandler(composite, (PasswordCallback) callback);
+                       } else if (callback instanceof LocaleCallback) {
+                               createLocaleHandler(composite, (LocaleCallback) callback);
                        }
                }
        }
@@ -82,12 +116,41 @@ public class DefaultLoginDialog extends AbstractLoginDialog {
                });
        }
 
+       private void createLocaleHandler(Composite composite,
+                       final LocaleCallback callback) {
+               String[] labels = callback.getSupportedLocalesLabels();
+               if (labels.length == 0)
+                       return;
+               Label label = new Label(composite, SWT.NONE);
+               label.setText(callback.getPrompt());
+
+               final Combo combo = new Combo(composite, SWT.READ_ONLY);
+               combo.setItems(labels);
+               combo.select(callback.getDefaultIndex());
+               combo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+               combo.addSelectionListener(new SelectionListener() {
+                       @Override
+                       public void widgetSelected(SelectionEvent e) {
+                               callback.setSelectedIndex(combo.getSelectionIndex());
+                       }
+
+                       @Override
+                       public void widgetDefaultSelected(SelectionEvent e) {
+                       }
+               });
+       }
+
        private void createNameHandler(Composite composite,
                        final NameCallback callback) {
                Label label = new Label(composite, SWT.NONE);
                label.setText(callback.getPrompt());
                final Text text = new Text(composite, SWT.SINGLE | SWT.LEAD
                                | SWT.BORDER);
+               if (callback.getDefaultName() != null) {
+                       // set default value, if provided
+                       text.setText(callback.getDefaultName());
+                       callback.setName(callback.getDefaultName());
+               }
                text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
                text.addModifyListener(new ModifyListener() {
 
@@ -123,35 +186,4 @@ public class DefaultLoginDialog extends AbstractLoginDialog {
 
        public void internalHandle() {
        }
-
-       // hack to simulate modal
-       // see
-       // http://dev.eclipse.org/mhonarc/newsLists/news.eclipse.platform.jface/msg00181.html
-       // protected void setShellStyle(int newShellStyle) {
-       // // turn off APPLICATION_MODAL
-       // int newstyle = newShellStyle & ~SWT.APPLICATION_MODAL;
-       // // turn on MODELESS
-       // newstyle |= SWT.MODELESS;
-       // super.setShellStyle(newstyle);
-       // }
-       //
-       // public int open() {
-       //
-       // int retVal = super.open();
-       // // this will let the caller wait till OK, Cancel is
-       // // pressed, but will let the other GUI responsive
-       // pumpMessages();
-       // return retVal;
-       // }
-       //
-       // protected void pumpMessages() {
-       // Shell sh = getShell();
-       // Display disp = sh.getDisplay();
-       // while (!sh.isDisposed()) {
-       // if (!disp.readAndDispatch())
-       // disp.sleep();
-       // }
-       // disp.update();
-       // }
-
 }