private Component makeDialogComponents()
	{
		JPanel dialogPanel = new JPanel();
		dialogPanel.setLayout(new BorderLayout());

		JPanel gridPanel = new JPanel();
		GuiGridLayout grid = new GuiGridLayout(gridPanel);
		grid.add(new JLabel(I18nManager.getText("dialog.gpsies.username")));
		_usernameField = new JTextField(15);
		grid.add(_usernameField);
		grid.add(new JLabel(I18nManager.getText("dialog.gpsies.password")));
		_passwordField = new JPasswordField(15);
		grid.add(_passwordField);
		// Track name and description
		grid.add(new JLabel(I18nManager.getText("dialog.gpsies.column.name")));
		_nameField = new JTextField(15);
		grid.add(_nameField);
		grid.add(new JLabel(I18nManager.getText("dialog.gpsies.description")));
		_descField = new JTextArea(5, 15);
		_descField.setLineWrap(true);
		_descField.setWrapStyleWord(true);
		grid.add(new JScrollPane(_descField));
		// Listener on all these text fields to enable/disable the ok button
		KeyAdapter keyListener = new KeyAdapter() {
			/** Key released */
			public void keyReleased(KeyEvent inE) {
				enableOK();
				if (inE.getKeyCode() == KeyEvent.VK_ESCAPE) {
					_dialog.dispose();
				}
			}
		};
		_usernameField.addKeyListener(keyListener);
		_passwordField.addKeyListener(keyListener);
		_nameField.addKeyListener(keyListener);
		// Listen for tabs on description field, to change focus not enter tabs
		_descField.addKeyListener(new KeyAdapter() {
			/** Key pressed */
			public void keyPressed(KeyEvent inE) {
				if (inE.getKeyCode() == KeyEvent.VK_TAB) {
					inE.consume();
					if (inE.isShiftDown()) {
						_nameField.requestFocusInWindow();
					}
					else {
						_privateCheckbox.requestFocusInWindow();
					}
				}
			}
		});
		// Listen for Ctrl-backspace on password field (delete contents)
		_passwordField.addKeyListener(new KeyAdapter() {
			/** Key released */
			public void keyReleased(KeyEvent inE) {
				if (inE.isControlDown() && (inE.getKeyCode() == KeyEvent.VK_BACK_SPACE
					|| inE.getKeyCode() == KeyEvent.VK_DELETE)) {
					_passwordField.setText("");
				}
			}
		});
		// Checkbox for private / public
		grid.add(new JLabel(I18nManager.getText("dialog.gpsies.keepprivate")));
		_privateCheckbox = new JCheckBox();
		_privateCheckbox.setSelected(true);
		grid.add(_privateCheckbox);

		// panel for activity type checkboxes
		JPanel activityPanel = new JPanel();
		activityPanel.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
		ChangeListener checkListener = new ChangeListener() {
			public void stateChanged(ChangeEvent arg0) {
				enableOK();
			}
		};
		GuiGridLayout actGrid = new GuiGridLayout(activityPanel, true);
		final int numActivities = ACTIVITY_KEYS.length;
		_activityCheckboxes = new JCheckBox[numActivities];
		for (int i=0; i<numActivities; i++)
		{
			_activityCheckboxes[i] = new JCheckBox(I18nManager.getText("dialog.gpsies.activity." + ACTIVITY_KEYS[i]));
			_activityCheckboxes[i].addChangeListener(checkListener);
			actGrid.add(_activityCheckboxes[i]);
		}
		grid.add(new JLabel(I18nManager.getText("dialog.gpsies.activities")));
		grid.add(activityPanel);
		JPanel midPanel = new JPanel();
		midPanel.setLayout(new BoxLayout(midPanel, BoxLayout.Y_AXIS));
		midPanel.add(gridPanel);
		dialogPanel.add(midPanel, BorderLayout.CENTER);

		// button panel at bottom
		JPanel buttonPanel = new JPanel();
		buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
		_uploadButton = new JButton(I18nManager.getText("button.upload"));
		_uploadButton.setEnabled(false);
		_uploadButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				startUpload();
			}
		});
		buttonPanel.add(_uploadButton);
		JButton cancelButton = new JButton(I18nManager.getText("button.cancel"));
		cancelButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				_dialog.dispose();
			}
		});
		buttonPanel.add(cancelButton);
		dialogPanel.add(buttonPanel, BorderLayout.SOUTH);
		dialogPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 15));
		return dialogPanel;
	}