Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
  • 5 commits
  • 5 files changed
  • 0 comments
  • 2 contributors
65 plugins/net.bioclipse.usermanager/src/net/bioclipse/usermanager/LoginWizardPage.java
... ... @@ -0,0 +1,65 @@
  1 +/* *****************************************************************************
  2 + * Copyright (c) 2007-2009 Bioclipse Project
  3 + * All rights reserved. This program and the accompanying materials
  4 + * are made available under the terms of the Eclipse Public License v1.0
  5 + * which accompanies this distribution, and is available at
  6 + * http://www.eclipse.org/legal/epl-v10.html
  7 + *
  8 + * Contributors:
  9 + *
  10 + *******************************************************************************/
  11 +package net.bioclipse.usermanager;
  12 +
  13 +import net.bioclipse.usermanager.dialogs.DialogArea;
  14 +import org.eclipse.jface.wizard.WizardPage;
  15 +import org.eclipse.swt.widgets.Composite;
  16 +
  17 +/**
  18 + * This is the wizard page for log-in into Bioclipse.
  19 + *
  20 + * @author Klas J�nsson (aka "konditorn")
  21 + *
  22 + */
  23 +public class LoginWizardPage extends WizardPage {
  24 +
  25 + private DialogArea loginDialogArea;
  26 +
  27 + protected LoginWizardPage(String pageName, UserContainer userContainer) {
  28 + super(pageName);
  29 + this.loginDialogArea = new DialogArea(userContainer ,true, this);
  30 + }
  31 +
  32 + @Override
  33 + public void createControl(Composite parent) {
  34 + Composite container = loginDialogArea.getLoginArea(parent);
  35 + setControl(container);
  36 + setErrorMessage(loginDialogArea.getErrorMessage());
  37 + }
  38 +
  39 + @Override
  40 + public boolean isPageComplete() {
  41 + return !loginDialogArea.getErrorFlag();
  42 + }
  43 +
  44 + /**
  45 + * This method just passes on the username written in the text-field in the
  46 + * login dialog.
  47 + *
  48 + * @return The username
  49 + */
  50 + public String getUsername() {
  51 + return loginDialogArea.getUsername();
  52 + }
  53 + /**
  54 + * This method just passes on the password written in the text-field in the
  55 + * login dialog.
  56 + *
  57 + * @return The password
  58 + */
  59 + public String getPassword() {
  60 + return loginDialogArea.getPassword();
  61 +
  62 + }
  63 +
  64 +}
  65 +
184 plugins/net.bioclipse.usermanager/src/net/bioclipse/usermanager/NewAccountWizard.java
@@ -10,17 +10,27 @@
10 10 ******************************************************************************/
11 11 package net.bioclipse.usermanager;
12 12
  13 +import net.bioclipse.core.util.LogUtils;
13 14 import net.bioclipse.usermanager.business.IUserManager;
14 15 import net.bioclipse.usermanager.dialogs.CreateUserDialog;
15 16 import net.bioclipse.usermanager.dialogs.LoginDialog;
16 17
  18 +import org.apache.log4j.Logger;
  19 +import org.eclipse.core.runtime.IProgressMonitor;
  20 +import org.eclipse.core.runtime.IStatus;
  21 +import org.eclipse.core.runtime.Status;
  22 +import org.eclipse.core.runtime.SubProgressMonitor;
  23 +import org.eclipse.core.runtime.jobs.Job;
  24 +import org.eclipse.jface.dialogs.MessageDialog;
17 25 import org.eclipse.jface.resource.ImageDescriptor;
18 26 import org.eclipse.jface.viewers.IStructuredSelection;
19 27 import org.eclipse.jface.window.Window;
20 28 import org.eclipse.jface.wizard.Wizard;
  29 +import org.eclipse.swt.widgets.Display;
21 30 import org.eclipse.ui.INewWizard;
22 31 import org.eclipse.ui.IWorkbench;
23 32 import org.eclipse.ui.PlatformUI;
  33 +import org.eclipse.ui.handlers.IHandlerService;
24 34
25 35 /**
26 36 * A wizard for handling the users third parts accounts
@@ -30,75 +40,143 @@
30 40 */
31 41 public class NewAccountWizard extends Wizard implements INewWizard {
32 42
33   - private NewAccountWizardPage mainPage;
  43 + private static final Logger logger
  44 + = Logger.getLogger(LoginDialog.class);
  45 +
  46 + private NewAccountWizardPage addAccountPage;
  47 + private LoginWizardPage loginPage;
34 48
35 49 public NewAccountWizard() {
36   - boolean cancel = false;
37   - IUserManager usermanager = Activator.getDefault().getUserManager();
38   - if (usermanager.getUserNames().size() == 0) {
39   - UserContainer sandbox = usermanager.getSandBoxUserContainer();
40   - CreateUserDialog dialog
41   - = new CreateUserDialog( PlatformUI.getWorkbench()
42   - .getActiveWorkbenchWindow()
43   - .getShell(), sandbox );
44   - dialog.open();
45   - if (dialog.getReturnCode() == dialog.OK) {
46   - usermanager.switchUserContainer( sandbox );
47   - }
48   - else if (dialog.getReturnCode() == dialog.CANCEL) {
49   - cancel = true;
50   - }
51   - }
52   -
53   - if ( !cancel && !usermanager.isLoggedIn() ) {
54   - UserContainer sandbox = usermanager.getSandBoxUserContainer();
55   - LoginDialog loginDialog
56   - = new LoginDialog( PlatformUI.getWorkbench()
57   - .getActiveWorkbenchWindow()
58   - .getShell(),
59   - sandbox );
60   -
61   - loginDialog.open();
62   - if ( loginDialog.getReturnCode() == LoginDialog.OK ) {
63   - if ( loginDialog.isUserContainerEdited() ) {
64   - Activator.getDefault().getUserManager()
65   - .switchUserContainer(sandbox);
66   - }
67   - }
68   - }
  50 + IUserManager usermanager = Activator.getDefault().getUserManager();
  51 + if (usermanager.getUserNames().size() == 0) {
  52 + UserContainer sandbox = usermanager.getSandBoxUserContainer();
  53 + CreateUserDialog dialog
  54 + = new CreateUserDialog( PlatformUI.getWorkbench()
  55 + .getActiveWorkbenchWindow()
  56 + .getShell(), sandbox );
  57 + dialog.open();
  58 + if (dialog.getReturnCode() == Window.OK) {
  59 + usermanager.switchUserContainer( sandbox );
  60 + }
  61 + else if (dialog.getReturnCode() == Window.CANCEL) {
  62 + dispose();
  63 + }
  64 + }
69 65 }
70 66
71 67 @Override
72 68 public void init(IWorkbench workbench, IStructuredSelection selection) {
73   - setWindowTitle("Add an account to Bioclipse");
74   - setNeedsProgressMonitor(true);
  69 + setWindowTitle("Add an account to Bioclipse");
  70 + setNeedsProgressMonitor(true);
75 71 }
76   -
77   - public void addPages() {
78   - super.addPages();
79   - // TODO add the Bioclipse create-account and log-in dialogs as pages
80   - // are the any more to be added?
81   - mainPage = new NewAccountWizardPage("mainPage");
82   - mainPage.setTitle("New Account");
83   - mainPage.setDescription("Add a third-part account to Bioclipse");
84   - addPage(mainPage);
85   - setDefaultPageImageDescriptor(ImageDescriptor
86   - .createFromFile(this.getClass(),
87   - "BioclipseAccountLogo3_medium.png"));
88   - }
89   -
  72 +
  73 + public void addPages() {
  74 + super.addPages();
  75 + IUserManager usermanager = Activator.getDefault().getUserManager();
  76 + if ( !usermanager.isLoggedIn() ) {
  77 + UserContainer sandbox = usermanager.getSandBoxUserContainer();
  78 + loginPage = new LoginWizardPage("loginPage", sandbox);
  79 + loginPage.setTitle("Log In To Your Bioclipse Account");
  80 + loginPage.setDescription("Before adding an acount you have to " +
  81 + "loggin or create a new acount.");
  82 + addPage(loginPage);
  83 + }
  84 +
  85 + addAccountPage = new NewAccountWizardPage("addAccountPage");
  86 + addAccountPage.setTitle("New Account");
  87 + addAccountPage.setDescription("Add a third-part account to Bioclipse");
  88 + addPage(addAccountPage);
  89 +
  90 +
  91 + setDefaultPageImageDescriptor(ImageDescriptor
  92 + .createFromFile(this.getClass(),
  93 + "BioclipseAccountLogo3_medium.png"));
  94 + }
  95 +
90 96 @Override
91 97 public boolean performFinish() {
92   - if (mainPage.createAccount()) {
  98 + IUserManager usermanager = Activator.getDefault().getUserManager();
  99 + if ( !usermanager.isLoggedIn() ) {
  100 + performLogin();
  101 + }
  102 +
  103 + if (addAccountPage.createAccount()) {
93 104 dispose();
94 105 return true;
95 106 } else
96 107 return false;
97 108 }
98   -
  109 +
99 110 @Override
100 111 public boolean canFinish() {
101   - return mainPage.isPageComplete();
  112 + return addAccountPage.isPageComplete();
102 113 }
103 114
  115 + public boolean performCancel() {
  116 + return true;
  117 + }
  118 +
  119 + /**
  120 + * This method log in the user.
  121 + */
  122 + private void performLogin() {
  123 + final String username = loginPage.getUsername();
  124 + final String password = loginPage.getPassword();
  125 + Job job = new Job("Signing in " + username) {
  126 +
  127 + @Override
  128 + protected IStatus run( IProgressMonitor monitor ) {
  129 +
  130 + try {
  131 + int scale = 1000;
  132 + monitor.beginTask( "Signing in...",
  133 + IProgressMonitor.UNKNOWN );
  134 + Activator.getDefault().getUserManager()
  135 + .signInWithProgressBar(
  136 + username,
  137 + password,
  138 + new SubProgressMonitor(
  139 + monitor,
  140 + 1 * scale) );
  141 + }
  142 + catch ( final Exception e ) {
  143 + Display.getDefault().asyncExec(new Runnable() {
  144 +
  145 + public void run() {
  146 + MessageDialog.openInformation(
  147 + PlatformUI
  148 + .getWorkbench()
  149 + .getActiveWorkbenchWindow()
  150 + .getShell(),
  151 + "Could not sign in "
  152 + + username,
  153 + e.getMessage() );
  154 + try {
  155 + ((IHandlerService)
  156 + PlatformUI.getWorkbench()
  157 + .getActiveWorkbenchWindow()
  158 + .getService(IHandlerService.class) )
  159 + .executeCommand(
  160 + "net.bioclipse.usermanager" +
  161 + ".commands.login",
  162 + null );
  163 + }
  164 + catch ( Exception e ) {
  165 + LogUtils.handleException(
  166 + e,
  167 + logger,
  168 + "net.bioclipse.usermanager" );
  169 + }
  170 + }
  171 + });
  172 + }
  173 + finally {
  174 + monitor.done();
  175 + }
  176 + return Status.OK_STATUS;
  177 + }
  178 + };
  179 + job.setUser( true );
  180 + job.schedule();
  181 + }
104 182 }
19 plugins/net.bioclipse.usermanager/src/net/bioclipse/usermanager/NewAccountWizardPage.java
@@ -30,7 +30,7 @@
30 30 /**
31 31 * The wizard page that handles the different parts accounts.
32 32 *
33   - * @author Klas J�nsson
  33 + * @author Klas J�nsson (aka "konditorn")
34 34 *
35 35 */
36 36 public class NewAccountWizardPage extends WizardPage implements Listener {
@@ -95,12 +95,6 @@ public void createControl(Composite parent) {
95 95 giveFocus();
96 96 }
97 97 setControl(container);
98   - if ( !Activator.getDefault().getUserManager().isLoggedIn() ) {
99   - System.out.println("CANCEL!" + this.getWizard().performCancel());
100   - // TODO FIXME find a better way to do this that does not cause an
101   - // Exception.
102   - this.getShell().close();
103   - }
104 98 }
105 99
106 100
@@ -213,10 +207,13 @@ private String createErrorMessage(ArrayList<String> unfilledFields) {
213 207
214 208 @Override
215 209 public boolean isPageComplete() {
216   - if (addedAccounts.size()>0) {
217   - AccountPropertiesPage account =
218   - addedAccounts.get(accountTypeCombo.getSelectionIndex());
219   - return account.isFieldsProperlyFilled();
  210 + if (isCurrentPage()) {
  211 + if (addedAccounts.size()>0) {
  212 + AccountPropertiesPage account =
  213 + addedAccounts.get(accountTypeCombo.getSelectionIndex());
  214 + return account.isFieldsProperlyFilled();
  215 + } else
  216 + return false;
220 217 } else
221 218 return false;
222 219 }
275 plugins/net.bioclipse.usermanager/src/net/bioclipse/usermanager/dialogs/DialogArea.java
... ... @@ -0,0 +1,275 @@
  1 +/* *****************************************************************************
  2 + * Copyright (c) 2007-2009 Bioclipse Project
  3 + * All rights reserved. This program and the accompanying materials
  4 + * are made available under the terms of the Eclipse Public License v1.0
  5 + * which accompanies this distribution, and is available at
  6 + * http://www.eclipse.org/legal/epl-v10.html
  7 + *
  8 + * Contributors:
  9 + *
  10 + *******************************************************************************/
  11 +
  12 +package net.bioclipse.usermanager.dialogs;
  13 +
  14 +import net.bioclipse.usermanager.UserContainer;
  15 +
  16 +import org.eclipse.jface.resource.ImageDescriptor;
  17 +import org.eclipse.jface.window.Window;
  18 +import org.eclipse.jface.wizard.WizardPage;
  19 +import org.eclipse.swt.SWT;
  20 +import org.eclipse.swt.events.SelectionAdapter;
  21 +import org.eclipse.swt.events.SelectionEvent;
  22 +import org.eclipse.swt.graphics.Image;
  23 +import org.eclipse.swt.layout.FormAttachment;
  24 +import org.eclipse.swt.layout.FormData;
  25 +import org.eclipse.swt.layout.FormLayout;
  26 +import org.eclipse.swt.layout.GridData;
  27 +import org.eclipse.swt.widgets.Button;
  28 +import org.eclipse.swt.widgets.Composite;
  29 +import org.eclipse.swt.widgets.Control;
  30 +import org.eclipse.swt.widgets.Event;
  31 +import org.eclipse.swt.widgets.Label;
  32 +import org.eclipse.swt.widgets.Listener;
  33 +import org.eclipse.swt.widgets.Text;
  34 +import org.eclipse.ui.PlatformUI;
  35 +
  36 +/**
  37 + * This class creates an object that can provide the components and
  38 + * the logic for handling them for e.g. a login dialog or creating a Bioclipse
  39 + * account
  40 + *
  41 + * @author Klas J�nsson (aka "konditorn")
  42 + *
  43 + */
  44 +public class DialogArea implements Listener {
  45 +
  46 + private UserContainer userContainer=null;
  47 + private Label usernameLabel;
  48 + private Label passwordLabel;
  49 + private Label repeatPasswordLabel;
  50 + private Text passwordText;
  51 + private Text usernameText;
  52 + private Text repeatPasswordText;
  53 + private boolean userContainerEdited;
  54 + private boolean createNewAccountButton;
  55 + private boolean errorFlag;
  56 + private WizardPage page;
  57 +
  58 + /**
  59 + * The constructor.
  60 + *
  61 + * @param userContainer
  62 + * @param createNewAccountButton Set to true if this button is wanted.
  63 + * @param page If this is a part of a wizard add it here if not set it to
  64 + * null
  65 + */
  66 + public DialogArea(UserContainer userContainer,
  67 + Boolean createNewAccountButton, WizardPage page) {
  68 + this.userContainer = userContainer;
  69 + this.userContainerEdited = false;
  70 + this.createNewAccountButton = createNewAccountButton;
  71 + this.errorFlag = true;
  72 + this.page = page;
  73 + }
  74 +
  75 + /**
  76 + * This method is used when ever a dialog for login in Bioclipse is wanted.
  77 + *
  78 + * @param parent The component where it will live
  79 + * @return A composite with the different SWT-components that are needed.
  80 + */
  81 + public Composite getLoginArea(Composite parent) {
  82 + Composite container = new Composite(parent, SWT.NONE);
  83 + container.setLayout(new FormLayout());
  84 + container.setLayoutData(new GridData(GridData.FILL_BOTH));
  85 +
  86 + usernameLabel = new Label(container, SWT.NONE);
  87 + final FormData formData = new FormData();
  88 + usernameLabel.setLayoutData(formData);
  89 + usernameLabel.setText("Username:");
  90 +
  91 + passwordLabel = new Label(container, SWT.NONE);
  92 + final FormData formData_1 = new FormData();
  93 + passwordLabel.setLayoutData(formData_1);
  94 + passwordLabel.setText("Password:");
  95 +
  96 + passwordText = new Text(container, SWT.BORDER | SWT.PASSWORD);
  97 + formData_1.bottom = new FormAttachment(passwordText, 0, SWT.BOTTOM);
  98 + formData_1.right = new FormAttachment(passwordText, -5, SWT.LEFT);
  99 + final FormData formData_2 = new FormData();
  100 + formData_2.top = new FormAttachment(0, 93);
  101 + passwordText.setLayoutData(formData_2);
  102 + passwordText.addListener(SWT.CHANGED, this);
  103 +
  104 + usernameText = new Text(container, SWT.BORDER);
  105 + formData.bottom = new FormAttachment(usernameText, 0, SWT.BOTTOM);
  106 + formData.right = new FormAttachment(usernameText, -5, SWT.LEFT);
  107 + formData_2.right = new FormAttachment(usernameText, 0, SWT.RIGHT);
  108 + formData_2.left = new FormAttachment(usernameText, 0, SWT.LEFT);
  109 + final FormData formData_3 = new FormData();
  110 + formData_3.left = new FormAttachment(0, 140);
  111 + formData_3.right = new FormAttachment(100, -34);
  112 + formData_3.top = new FormAttachment(0, 53);
  113 + usernameText.setLayoutData(formData_3);
  114 + usernameText.addListener(SWT.CHANGED, this);
  115 +
  116 + if (createNewAccountButton) {
  117 + Button createNewKeyringButton = new Button(container, SWT.NONE);
  118 + createNewKeyringButton.addSelectionListener(new SelectionAdapter() {
  119 + /*
  120 + * CREATE NEW USER
  121 + */
  122 + public void widgetSelected(SelectionEvent e) {
  123 +
  124 + CreateUserDialog createDialog =
  125 + new CreateUserDialog( PlatformUI
  126 + .getWorkbench()
  127 + .getActiveWorkbenchWindow()
  128 + .getShell(),
  129 + userContainer );
  130 + createDialog.open();
  131 + if(createDialog.getReturnCode() == Window.OK) {
  132 + createDialog.close();
  133 + EditUserDialog dialog =
  134 + new EditUserDialog( PlatformUI
  135 + .getWorkbench()
  136 + .getActiveWorkbenchWindow()
  137 + .getShell(),
  138 + userContainer );
  139 + dialog.open();
  140 + if(dialog.getReturnCode() == Window.OK) {
  141 + userContainerEdited = true;
  142 + }
  143 + }
  144 + }
  145 + });
  146 + final FormData formData_4 = new FormData();
  147 + formData_4.right = new FormAttachment(100, -34);
  148 + formData_4.top = new FormAttachment(0, 136);
  149 + createNewKeyringButton.setLayoutData(formData_4);
  150 + createNewKeyringButton.setText("Create new Account...");
  151 + container.setTabList(new Control[] { usernameText,
  152 + passwordText,
  153 + passwordLabel,
  154 + usernameLabel,
  155 + createNewKeyringButton });
  156 + } else {
  157 + repeatPasswordLabel = new Label(container, SWT.NONE);
  158 + final FormData formData_4 = new FormData();
  159 + repeatPasswordLabel.setLayoutData(formData_2);
  160 + repeatPasswordLabel.setText("Repeat password:");
  161 +
  162 + repeatPasswordText = new Text(container, SWT.BORDER | SWT.PASSWORD);
  163 + formData_2.bottom = new FormAttachment(repeatPasswordText, 0, SWT.BOTTOM);
  164 + formData_2.right = new FormAttachment(repeatPasswordText, -5, SWT.LEFT);
  165 + formData_4.left = new FormAttachment(repeatPasswordText, -316, SWT.RIGHT);
  166 + formData_4.right = new FormAttachment(repeatPasswordText, 0, SWT.RIGHT);
  167 + final FormData formData_5 = new FormData();
  168 + formData_5.top = new FormAttachment(0, 107);
  169 + formData_5.left = new FormAttachment(0, 154);
  170 + formData_5.right = new FormAttachment(0, 470);
  171 + repeatPasswordText.setLayoutData(formData_5);
  172 + repeatPasswordText.addListener(SWT.CHANGED, this);
  173 +
  174 + container.setTabList(new Control[] { usernameText,
  175 + passwordText,
  176 + repeatPasswordText,
  177 + usernameLabel,
  178 + passwordLabel,
  179 + repeatPasswordLabel });
  180 + }
  181 +
  182 + Label icon = new Label(container, SWT.NONE);
  183 + ImageDescriptor imgDesc = ImageDescriptor
  184 + .createFromFile(this.getClass(),
  185 + "../../../../../icons/login_16.png");
  186 + Image img = imgDesc.createImage();
  187 + icon.setImage(img);
  188 + final FormData formData_6 = new FormData();
  189 + formData_6.bottom = new FormAttachment(usernameText, 0, SWT.RIGHT);
  190 + formData_6.left = new FormAttachment(usernameText, 0, SWT.RIGHT);
  191 + icon.setLayoutData(formData_6);
  192 +
  193 + usernameText.setFocus();
  194 +
  195 + return container;
  196 + }
  197 +
  198 + public String getUsername() {
  199 + return usernameText.getText();
  200 + }
  201 +
  202 + public String getPassword() {
  203 + return passwordText.getText();
  204 + }
  205 +
  206 + public boolean isUserContainerEdited() {
  207 + return userContainerEdited;
  208 + }
  209 +
  210 + /**
  211 + * A method to see if all fields are filled in.
  212 + *
  213 + * @return True if all fields are filled in.
  214 + */
  215 + public boolean isFilledIn() {
  216 + if (createNewAccountButton) {
  217 + return ( !usernameText.getText().isEmpty() &&
  218 + !passwordText.getText().isEmpty() );
  219 + } else
  220 + return ( !usernameText.getText().isEmpty() &&
  221 + !passwordText.getText().isEmpty() &&
  222 + !repeatPasswordText.getText().isEmpty() );
  223 + }
  224 +
  225 + /**
  226 + * Returns a string that explains what's wrong, if nothing is wrong it
  227 + * returns null.
  228 + *
  229 + * @return The error-message
  230 + */
  231 + public String getErrorMessage() {
  232 + String message = null;
  233 + if (!isFilledIn()) {
  234 + if (createNewAccountButton) {
  235 + message = "Please fill in all fields.\n" +
  236 + "Fill in your username and your password.";
  237 + } else {
  238 + message = "Please fill in all fields.\n" +
  239 + "Fill in your username and your password (twice).";
  240 + }
  241 + } else if (!createNewAccountButton &&
  242 + !passwordText.getText().equals(repeatPasswordText.getText()))
  243 + message = "Not same password:\n The repeated password doesnt" +
  244 + " match the password";
  245 + return message;
  246 + }
  247 +
  248 + /**
  249 + * This method reports if there's any error.
  250 + *
  251 + * @return True if the exists an error.
  252 + */
  253 + public boolean getErrorFlag() {
  254 + return errorFlag;
  255 + }
  256 +
  257 + @Override
  258 + public void handleEvent(Event event) {
  259 + if (!isFilledIn())
  260 + errorFlag = true;
  261 + else if (!createNewAccountButton &&
  262 + !passwordText.getText().equals(repeatPasswordText.getText()) )
  263 + errorFlag = true;
  264 + else
  265 + errorFlag = false;
  266 + if (page != null) {
  267 + page.setPageComplete(!errorFlag);
  268 + page.getWizard().getContainer().updateButtons();
  269 + page.setErrorMessage(getErrorMessage());
  270 + page.getWizard().getContainer().updateMessage();
  271 + }
  272 + }
  273 +
  274 +
  275 +}
2  plugins/net.bioclipse.usermanager/src/net/bioclipse/usermanager/dialogs/LoginDialog.java
@@ -187,7 +187,7 @@ protected void buttonPressed(int buttonId) {
187 187 /*
188 188 * LOGIN
189 189 */
190   - if (buttonId == IDialogConstants.OK_ID) {
  190 + if (buttonId == IDialogConstants.OK_ID) {
191 191 username = usernameText.getText();
192 192 password = passwordText.getText();
193 193 final String username = this.username;

No commit comments for this range

Something went wrong with that request. Please try again.