diff options
Diffstat (limited to 'update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/wizards/SitePage.java')
-rw-r--r-- | update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/wizards/SitePage.java | 557 |
1 files changed, 557 insertions, 0 deletions
diff --git a/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/wizards/SitePage.java b/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/wizards/SitePage.java new file mode 100644 index 000000000..bfba7e444 --- /dev/null +++ b/update/org.eclipse.update.ui/src/org/eclipse/update/internal/ui/wizards/SitePage.java @@ -0,0 +1,557 @@ +/******************************************************************************* + * Copyright (c) 2003, 2006 IBM Corporation 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.update.internal.ui.wizards; + +import java.net.URL; + +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.viewers.CheckStateChangedEvent; +import org.eclipse.jface.viewers.CheckboxTableViewer; +import org.eclipse.jface.viewers.ICheckStateListener; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerSorter; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.BusyIndicator; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Image; +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.Label; +import org.eclipse.swt.widgets.TableItem; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.forms.HyperlinkSettings; +import org.eclipse.ui.forms.widgets.ScrolledFormText; +import org.eclipse.update.internal.core.UpdateCore; +import org.eclipse.update.internal.core.UpdateManagerUtils; +import org.eclipse.update.internal.ui.UpdateUI; +import org.eclipse.update.internal.ui.UpdateUIImages; +import org.eclipse.update.internal.ui.UpdateUIMessages; +import org.eclipse.update.internal.ui.model.DiscoveryFolder; +import org.eclipse.update.internal.ui.model.SiteBookmark; +import org.eclipse.update.internal.ui.model.SiteCategory; +import org.eclipse.update.internal.ui.model.UpdateModel; +import org.eclipse.update.internal.ui.parts.SWTUtil; +import org.eclipse.update.operations.IUpdateModelChangedListener; +import org.eclipse.update.search.EnvironmentFilter; +import org.eclipse.update.search.UpdateSearchRequest; +import org.eclipse.update.search.UpdateSearchScope; + +public class SitePage extends BannerPage implements ISearchProvider { + + class SitesLabelProvider extends LabelProvider { + + public Image getImage(Object obj) { + if (obj instanceof SiteBookmark) + return UpdateUI.getDefault().getLabelProvider().get( + UpdateUIImages.DESC_SITE_OBJ); + return super.getImage(obj); + } + + public String getText(Object obj) { + if (obj instanceof SiteBookmark) { + return ((SiteBookmark) obj).getLabel(); + } + return super.getText(obj); + } + } + + class ModelListener implements IUpdateModelChangedListener { + public void objectChanged(Object object, String property) { + viewer.refresh(); + checkItems(); + } + + public void objectsAdded(Object parent, Object[] children) { + viewer.refresh(); + checkItems(); + } + + public void objectsRemoved(Object parent, Object[] children) { + viewer.refresh(); + checkItems(); + } + } + + private static DiscoveryFolder discoveryFolder = new DiscoveryFolder(); + private CheckboxTableViewer viewer; + private ScrolledFormText descLabel; + private Button addSiteButton; + private Button addLocalButton; + private Button addLocalZippedButton; + private Button editButton; + private Button removeButton; + private Button exportButton; + private Button importButton; + private Button envFilterCheck; + private Button automaticallySelectMirrorsCheckbox; + private EnvironmentFilter envFilter; + private UpdateSearchRequest searchRequest; + private ModelListener modelListener; + + private boolean automaticallySelectMirrors = true; + + public SitePage(UpdateSearchRequest searchRequest) { + super("SitePage"); //$NON-NLS-1$ + this.searchRequest = searchRequest; + setTitle(UpdateUIMessages.SitePage_title); + setDescription(UpdateUIMessages.SitePage_desc); + UpdateUI.getDefault().getLabelProvider().connect(this); + envFilter = new EnvironmentFilter(); + + modelListener = new ModelListener(); + UpdateUI.getDefault().getUpdateModel().addUpdateModelChangedListener( + modelListener); + } + + private void toggleEnvFilter(boolean add) { + if (add) + searchRequest.addFilter(envFilter); + else + searchRequest.removeFilter(envFilter); + } + + public void dispose() { + UpdateUI.getDefault().getLabelProvider().disconnect(this); + UpdateUI + .getDefault() + .getUpdateModel() + .removeUpdateModelChangedListener( + modelListener); + super.dispose(); + } + + /* + * (non-Javadoc) @see + * org.eclipse.update.internal.ui.wizards.BannerPage#createContents(org.eclipse.swt.widgets.Composite) + */ + protected Control createContents(Composite parent) { + Composite client = new Composite(parent, SWT.NULL); + GridLayout layout = new GridLayout(); + layout.numColumns = 2; + client.setLayout(layout); + + Label label = new Label(client, SWT.NULL); + label.setText(UpdateUIMessages.SitePage_label); + GridData gd = new GridData(); + gd.horizontalSpan = 2; + label.setLayoutData(gd); + + createViewer(client); + + Composite buttonContainer = new Composite(client, SWT.NULL); + buttonContainer.setLayoutData(new GridData(GridData.FILL_VERTICAL)); + layout = new GridLayout(); + layout.marginWidth = 0; + layout.marginHeight = 0; + buttonContainer.setLayout(layout); + + addSiteButton = new Button(buttonContainer, SWT.PUSH); + addSiteButton.setText(UpdateUIMessages.SitePage_addUpdateSite); + addSiteButton.setLayoutData( + new GridData(GridData.HORIZONTAL_ALIGN_FILL)); + SWTUtil.setButtonDimensionHint(addSiteButton); + addSiteButton.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + handleAddSite(); + } + }); + + addLocalButton = new Button(buttonContainer, SWT.PUSH); + addLocalButton.setText(UpdateUIMessages.SitePage_addLocalSite); + addLocalButton.setLayoutData( + new GridData(GridData.HORIZONTAL_ALIGN_FILL)); + SWTUtil.setButtonDimensionHint(addLocalButton); + addLocalButton.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + handleAddLocal(); + } + }); + + addLocalZippedButton = new Button(buttonContainer, SWT.PUSH); + addLocalZippedButton.setText(UpdateUIMessages.SitePage_addLocalZippedSite); + addLocalZippedButton.setLayoutData( + new GridData(GridData.HORIZONTAL_ALIGN_FILL)); + SWTUtil.setButtonDimensionHint(addLocalZippedButton); + addLocalZippedButton.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + handleAddLocalZipped(); + } + }); + + // separator + new Label(buttonContainer, SWT.None); + + editButton = new Button(buttonContainer, SWT.PUSH); + editButton.setText(UpdateUIMessages.SitePage_edit); + editButton.setEnabled(false); + editButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); + SWTUtil.setButtonDimensionHint(editButton); + editButton.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + handleEdit(); + } + }); + + removeButton = new Button(buttonContainer, SWT.PUSH); + removeButton.setText(UpdateUIMessages.SitePage_remove); + removeButton.setEnabled(false); + removeButton.setLayoutData( + new GridData(GridData.HORIZONTAL_ALIGN_FILL)); + SWTUtil.setButtonDimensionHint(removeButton); + removeButton.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + handleRemove(); + } + }); + + // separator + new Label(buttonContainer, SWT.None); + + importButton = new Button(buttonContainer, SWT.PUSH); + importButton.setText(UpdateUIMessages.SitePage_import); + importButton.setLayoutData( + new GridData(GridData.HORIZONTAL_ALIGN_FILL)); + SWTUtil.setButtonDimensionHint(importButton); + importButton.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + handleImport(); + } + }); + + exportButton = new Button(buttonContainer, SWT.PUSH); + exportButton.setText(UpdateUIMessages.SitePage_export); + exportButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); + SWTUtil.setButtonDimensionHint(exportButton); + exportButton.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + handleExport(); + } + }); + + descLabel = new ScrolledFormText(client, true); + descLabel.setText(""); //$NON-NLS-1$ + descLabel.setBackground(parent.getBackground()); + HyperlinkSettings settings = new HyperlinkSettings(parent.getDisplay()); + descLabel.getFormText().setHyperlinkSettings(settings); + + gd = new GridData(SWT.FILL, SWT.FILL, true, true); + gd.horizontalSpan = 1; + gd.heightHint = 30; + descLabel.setLayoutData(gd); + + envFilterCheck = new Button(client, SWT.CHECK); + envFilterCheck.setText(UpdateUIMessages.SitePage_ignore); + envFilterCheck.setSelection(true); + toggleEnvFilter(true); + envFilterCheck.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + toggleEnvFilter(envFilterCheck.getSelection()); + } + }); + gd = new GridData(); + gd.horizontalSpan = 2; + gd.verticalAlignment = SWT.BOTTOM; + envFilterCheck.setLayoutData(gd); + + + automaticallySelectMirrorsCheckbox = new Button(client, SWT.CHECK); + automaticallySelectMirrorsCheckbox.setText(UpdateUIMessages.SitePage_automaticallySelectMirrors); + automaticallySelectMirrorsCheckbox.setSelection(true); + automaticallySelectMirrorsCheckbox.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + automaticallySelectMirrors = automaticallySelectMirrorsCheckbox.getSelection(); + UpdateCore.getPlugin().getPluginPreferences().setValue(UpdateCore.P_AUTOMATICALLY_CHOOSE_MIRROR, automaticallySelectMirrors); + } + }); + gd = new GridData(); + gd.horizontalSpan = 2; + gd.verticalAlignment = SWT.BOTTOM; + automaticallySelectMirrorsCheckbox.setLayoutData(gd); + + Dialog.applyDialogFont(parent); + + PlatformUI.getWorkbench().getHelpSystem().setHelp(client, "org.eclipse.update.ui.SitePage"); //$NON-NLS-1$ + + return client; + } + + private void createViewer(Composite parent) { + viewer = + CheckboxTableViewer.newCheckList( + parent, + SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); + viewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH)); + viewer.setContentProvider(new IStructuredContentProvider() { + public Object[] getElements(Object parent) { + return getAllSiteBookmarks(); + } + + public void dispose() { + } + + public void inputChanged(Viewer viewer, Object oldInput, + Object newInput) { + } + }); + viewer.setLabelProvider(new SitesLabelProvider()); + viewer.setInput(UpdateUI.getDefault().getUpdateModel()); + + // bug # 83212 + viewer.setSorter( new ViewerSorter()); + + + initializeItems(); + + viewer.addCheckStateListener(new ICheckStateListener() { + public void checkStateChanged(CheckStateChangedEvent e) { + Object element = e.getElement(); + if (element instanceof SiteBookmark) + handleSiteChecked((SiteBookmark) element, e.getChecked()); + } + }); + + viewer + .addSelectionChangedListener(new ISelectionChangedListener() { + public void selectionChanged(SelectionChangedEvent e) { + handleSelectionChanged((IStructuredSelection) e.getSelection()); + } + }); + + } + + private void initializeItems() { + checkItems(); + updateSearchRequest(); + } + + private void checkItems() { + TableItem[] items = viewer.getTable().getItems(); + for (int i = 0; i < items.length; i++) { + SiteBookmark bookmark = (SiteBookmark) items[i].getData(); + viewer.setChecked(bookmark, bookmark.isSelected()); + } + } + + private void handleAddSite() { + NewUpdateSiteDialog dialog = new NewUpdateSiteDialog(getShell(), getAllSiteBookmarks()); + dialog.create(); + dialog.getShell().setText(UpdateUIMessages.SitePage_new); + if (dialog.open() == NewUpdateSiteDialog.OK) + updateSearchRequest(); + } + + private void handleAddLocal() { + SiteBookmark siteBookmark = LocalSiteSelector.getLocaLSite(getShell(), this.getAllSiteBookmarks()); + if (siteBookmark != null) { + if (handleNameEdit(siteBookmark) == EditSiteDialog.OK) { + siteBookmark.setSelected(true); + UpdateModel model = UpdateUI.getDefault().getUpdateModel(); + model.addBookmark(siteBookmark); + model.saveBookmarks(); + updateSearchRequest(); + } + } + return; + } + + private void handleAddLocalZipped() { + SiteBookmark siteBookmark = LocalSiteSelector + .getLocaLZippedSite(getShell(), this.getAllSiteBookmarks()); + if (siteBookmark != null) { + if (handleNameEdit(siteBookmark) == EditSiteDialog.OK) { + siteBookmark.setSelected(true); + UpdateModel model = UpdateUI.getDefault().getUpdateModel(); + model.addBookmark(siteBookmark); + model.saveBookmarks(); + updateSearchRequest(); + } + } + return; + } + + private void handleRemove() { + BusyIndicator + .showWhile(viewer.getControl().getDisplay(), new Runnable() { + public void run() { + UpdateModel updateModel = + UpdateUI.getDefault().getUpdateModel(); + IStructuredSelection ssel = + (IStructuredSelection) viewer.getSelection(); + SiteBookmark bookmark = (SiteBookmark) ssel.getFirstElement(); + String selName = bookmark.getLabel(); + boolean answer = MessageDialog + .openQuestion( + getShell(), + UpdateUIMessages.SitePage_remove_location_conf_title, + UpdateUIMessages.SitePage_remove_location_conf + + " " + selName); //$NON-NLS-1$ + + if (answer && !bookmark.isReadOnly()) { + updateModel.removeBookmark(bookmark); + updateSearchRequest(); + } + } + }); + } + + private void handleEdit() { + IStructuredSelection ssel = + (IStructuredSelection) viewer.getSelection(); + SiteBookmark bookmark = (SiteBookmark) ssel.getFirstElement(); + URL oldURL = bookmark.getURL(); + EditSiteDialog dialog = new EditSiteDialog(getShell(), bookmark, getAllSiteBookmarks()); + dialog.create(); + String title = bookmark.isLocal() ? UpdateUIMessages.SitePage_dialogEditLocal : UpdateUIMessages.SitePage_dialogEditUpdateSite; + // //$NON-NLS-2$ + dialog.getShell().setText(title); + if (dialog.open() == EditSiteDialog.OK ) { + URL newURL = bookmark.getURL(); + if (!UpdateManagerUtils.sameURL(oldURL, newURL)) { + UpdateModel model = UpdateUI.getDefault().getUpdateModel(); + model.fireObjectChanged(bookmark, null); + updateSearchRequest(); + } + } + } + + private void handleImport() { + SiteBookmark[] siteBookmarks = SitesImportExport.getImportedBookmarks(getShell()); + if (siteBookmarks != null && siteBookmarks.length > 0) { + UpdateModel model = UpdateUI.getDefault().getUpdateModel(); + SiteBookmark[] currentBookmarks = getAllSiteBookmarks(); + for (int i=0; i<siteBookmarks.length; i++) { + boolean siteExists = false; + for (int j=0; !siteExists && j<currentBookmarks.length; j++) + if (currentBookmarks[j].getURL().equals(siteBookmarks[i].getURL())) + siteExists = true; + if (!siteExists) + model.addBookmark(siteBookmarks[i]); + } + model.saveBookmarks(); + updateSearchRequest(); + } + return; + } + + private void handleExport() { + SitesImportExport.exportBookmarks(getShell(), getAllSiteBookmarks()); + } + + private int handleNameEdit(SiteBookmark bookmark) { + EditSiteDialog dialog = new EditSiteDialog(getShell(), bookmark, getAllSiteBookmarks(), true); + dialog.create(); + String title = bookmark.isLocal() ? UpdateUIMessages.SitePage_dialogEditLocal : UpdateUIMessages.SitePage_dialogEditUpdateSite; + // //$NON-NLS-2$ + dialog.getShell().setText(title); + int rc = dialog.open(); + return rc; + } + + private void handleSiteChecked(SiteBookmark bookmark, boolean checked) { + if (bookmark.isUnavailable()) { + bookmark.setSelected(false); + viewer.setChecked(bookmark, false); + return; + } + + bookmark.setSelected(checked); + updateSearchRequest(); + } + + + private void handleSelectionChanged(IStructuredSelection ssel) { + boolean enable = false; + Object item = ssel.getFirstElement(); + String description = null; + if (item instanceof SiteBookmark) { + enable = !((SiteBookmark) item).isReadOnly(); + description = ((SiteBookmark)item).getDescription(); + } else if (item instanceof SiteCategory) { +// IURLEntry descEntry = ((SiteCategory)item).getCategory().getDescription(); +// if (descEntry != null) +// description = descEntry.getAnnotation(); + } + editButton.setEnabled(enable); + removeButton.setEnabled(enable); + + if (description == null) + description = ""; //$NON-NLS-1$ + descLabel.setText(UpdateManagerUtils.getWritableXMLString(description)); + } + + private void updateSearchRequest() { + Object[] checked = viewer.getCheckedElements(); + + UpdateSearchScope scope = new UpdateSearchScope(); + int nsites = 0; + + for (int i = 0; i < checked.length; i++) { + if (checked[i] instanceof SiteBookmark) { + SiteBookmark bookmark = (SiteBookmark) checked[i]; + scope.addSearchSite( + bookmark.getLabel(), + bookmark.getURL(), + bookmark.getIgnoredCategories()); + nsites++; + } + } + searchRequest.setScope(scope); + setPageComplete(nsites > 0); + } + + public UpdateSearchRequest getSearchRequest() { + return searchRequest; + } + + public void setVisible(boolean value) { + super.setVisible(value); + if (value) { + // Reset all unavailable sites, so they can be tried again if the user wants it + SiteBookmark[] bookmarks = getAllSiteBookmarks(); + for (int i=0; i<bookmarks.length; i++) { + if (bookmarks[i].isUnavailable()) + bookmarks[i].setUnavailable(false); + } + automaticallySelectMirrors = UpdateCore.getPlugin().getPluginPreferences().getBoolean(UpdateCore.P_AUTOMATICALLY_CHOOSE_MIRROR); + automaticallySelectMirrorsCheckbox.setSelection(automaticallySelectMirrors); + } + } + + private SiteBookmark[] getAllSiteBookmarks() { + UpdateModel model = UpdateUI.getDefault().getUpdateModel(); + Object[] bookmarks = model.getBookmarkLeafs(); + Object[] sitesToVisit = + discoveryFolder.getChildren(discoveryFolder); + SiteBookmark[] all = new SiteBookmark[bookmarks.length + sitesToVisit.length]; + System.arraycopy(bookmarks, 0, all, 0, bookmarks.length); + System.arraycopy( + sitesToVisit, + 0, + all, + bookmarks.length, + sitesToVisit.length); + return all; + } + + public boolean isPageComplete() { + return viewer.getCheckedElements().length != 0; + } +} |