/**************************************************************************** * Copyright (c) 2004 Composent, Inc. and others. * 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: * Composent, Inc. - initial API and implementation *****************************************************************************/ package org.eclipse.ecf.internal.example.collab.start; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import org.eclipse.ecf.internal.example.collab.Messages; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.preference.FieldEditor; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.List; import org.eclipse.swt.widgets.Widget; public class URLListFieldEditor extends FieldEditor { private List list; private SelectionListener selectionListener; private Button removeButton; private Composite buttonBox; private java.util.List removedConnectionDetails = new ArrayList(); public URLListFieldEditor(String name, String labelText, Composite parent) { init(name, labelText); createControl(parent); } protected void adjustForNumColumns(int numColumns) { Control control = getLabelControl(); if (control != null) ((GridData) control.getLayoutData()).horizontalSpan = numColumns; ((GridData) list.getLayoutData()).horizontalSpan = numColumns - 1; } protected void createControl(Composite parent) { GridLayout layout = new GridLayout(); layout.numColumns = getNumberOfControls(); layout.marginWidth = 0; layout.marginHeight = 0; layout.horizontalSpacing = HORIZONTAL_GAP; parent.setLayout(layout); doFillIntoGrid(parent, layout.numColumns); } protected void doFillIntoGrid(Composite parent, int numColumns) { Control control = getLabelControl(parent); GridData gd = new GridData(); gd.horizontalSpan = numColumns; control.setLayoutData(gd); list = getListControl(parent); gd = new GridData(GridData.FILL_HORIZONTAL); gd.verticalAlignment = GridData.FILL; gd.horizontalSpan = numColumns - 1; gd.grabExcessHorizontalSpace = true; list.setLayoutData(gd); buttonBox = getButtonBoxControl(parent); gd = new GridData(); gd.verticalAlignment = GridData.BEGINNING; buttonBox.setLayoutData(gd); } public Composite getButtonBoxControl(Composite parent) { if (buttonBox == null) { buttonBox = new Composite(parent, SWT.NULL); GridLayout layout = new GridLayout(); layout.marginWidth = 0; buttonBox.setLayout(layout); createButtons(buttonBox); buttonBox.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent event) { removeButton = null; buttonBox = null; } }); } else { checkParent(buttonBox, parent); } selectionChanged(); return buttonBox; } private void createButtons(Composite box) { removeButton = createPushButton(box, Messages.URLListFieldEditor_BUTTON_REMOVE_TEXT); } private Button createPushButton(Composite parent, String key) { Button button = new Button(parent, SWT.PUSH); button.setText(JFaceResources.getString(key)); button.setFont(parent.getFont()); GridData data = new GridData(GridData.FILL_HORIZONTAL); int widthHint = convertHorizontalDLUsToPixels(button, IDialogConstants.BUTTON_WIDTH); data.widthHint = Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x); button.setLayoutData(data); button.addSelectionListener(getSelectionListener()); return button; } public List getListControl(Composite parent) { if (list == null) { list = new List(parent, SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL | SWT.H_SCROLL); list.setFont(parent.getFont()); list.addSelectionListener(getSelectionListener()); list.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent event) { list = null; } }); } else { checkParent(list, parent); } return list; } private SelectionListener getSelectionListener() { if (selectionListener == null) { createSelectionListener(); } return selectionListener; } public void createSelectionListener() { selectionListener = new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { Widget widget = event.widget; if (widget == removeButton) { removePressed(); } else if (widget == list) { selectionChanged(); } } }; } private void removePressed() { setPresentsDefaultValue(false); int index = list.getSelectionIndex(); if (index >= 0) { String key = list.getItem(index); ConnectionDetails cd = (ConnectionDetails) list.getData(key); removeConnectionDetails(cd); list.remove(index); selectionChanged(); } } private void removeConnectionDetails(ConnectionDetails cd) { removedConnectionDetails.add(cd); } private void selectionChanged() { int index = list.getSelectionIndex(); removeButton.setEnabled(index >= 0); } protected void doLoad() { if (list != null) { AccountStart as = new AccountStart(); as.loadConnectionDetailsFromPreferenceStore(); Collection contents = as.getConnectionDetails(); for (Iterator i = contents.iterator(); i.hasNext();) { ConnectionDetails cd = (ConnectionDetails) i.next(); String uri = cd.getContainerType() + ":" + cd.getTargetURI(); //$NON-NLS-1$ list.add(uri); list.setData(uri, cd); } } } protected void doStore() { for (Iterator i = removedConnectionDetails.iterator(); i.hasNext();) { ConnectionDetails cd = (ConnectionDetails) i.next(); AccountStart as = new AccountStart(); as.removeConnectionDetails(cd); } } public int getNumberOfControls() { return 2; } protected void doLoadDefault() { } }