package com.aptana.rdt.ui.gems; import java.util.Collections; import java.util.Set; import java.util.TreeSet; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.action.ActionContributionItem; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.part.ViewPart; import org.rubypeople.rdt.internal.ui.util.CollectionContentProvider; import org.rubypeople.rdt.ui.TableViewerSorter; import com.aptana.rdt.AptanaRDTPlugin; import com.aptana.rdt.core.gems.Gem; import com.aptana.rdt.core.gems.GemListener; import com.aptana.rdt.core.gems.IGemManager; public class GemsView extends ViewPart implements GemListener { private TableViewer gemViewer; private GemManagerSelectionAction gemManagerSelectionAction; private IGemManager gemManager; @Override public void createPartControl(Composite parent) { parent.setLayout(new GridLayout()); gemViewer = new TableViewer(parent, SWT.SINGLE | SWT.FULL_SELECTION); final Table gemTable = gemViewer.getTable(); gemTable.setHeaderVisible(true); gemTable.setLinesVisible(true); gemTable.setLayoutData(new GridData(GridData.FILL_BOTH)); gemTable.addKeyListener(new KeyListener() { public void keyReleased(KeyEvent e) { // ignore } public void keyPressed(KeyEvent e) { if (e.keyCode == SWT.DEL) { TableItem item = gemTable.getItem(gemTable.getSelectionIndex()); final Gem gem = (Gem) item.getData(); if (MessageDialog.openConfirm(gemTable.getShell(), null, GemsMessages.bind( GemsMessages.RemoveGemDialog_msg, gem.getName()))) { Job job = null; if (gem.hasMultipleVersions()) { final RemoveGemDialog dialog = new RemoveGemDialog(Display.getDefault().getActiveShell(), gem.versions()); if (dialog.open() == RemoveGemDialog.OK) { job = new Job("Removing gem") { @Override protected IStatus run(IProgressMonitor monitor) { return getGemManager().removeGem( new Gem(gem.getName(), dialog.getVersion(), gem.getDescription()), monitor); } }; } } else { job = new Job("Removing gem") { @Override protected IStatus run(IProgressMonitor monitor) { return getGemManager().removeGem(gem, monitor); } }; } if (job != null) { job.setUser(true); job.schedule(); } } } } }); TableColumn nameColumn = new TableColumn(gemTable, SWT.LEFT); nameColumn.setText(GemsMessages.GemsView_NameColumn_label); nameColumn.setWidth(150); TableColumn versionColumn = new TableColumn(gemTable, SWT.LEFT); versionColumn.setText(GemsMessages.GemsView_VersionColumn_label); versionColumn.setWidth(75); TableColumn descriptionColumn = new TableColumn(gemTable, SWT.LEFT); descriptionColumn.setText(GemsMessages.GemsView_DescriptionColumn_label); descriptionColumn.setWidth(275); gemViewer.setLabelProvider(new GemLabelProvider()); gemViewer.setContentProvider(new CollectionContentProvider()); TableViewerSorter.bind(gemViewer); getSite().setSelectionProvider(gemViewer); gemViewer.setInput(getSortedGems()); createPopupMenu(); getGemManager().addGemListener(this); gemManagerSelectionAction = new GemManagerSelectionAction(this); IActionBars bars = getViewSite().getActionBars(); bars.getToolBarManager().add(gemManagerSelectionAction); } public IGemManager getGemManager() { if (gemManager == null) { gemManager = AptanaRDTPlugin.getDefault().getGemManager(); } return gemManager; } @Override public void dispose() { getGemManager().removeGemListener(this); super.dispose(); } @Override public void setFocus() { gemViewer.getTable().setFocus(); } /** * Creates and registers the context menu */ private void createPopupMenu() { MenuManager menuMgr = new MenuManager("#PopupMenu"); menuMgr.setRemoveAllWhenShown(true); menuMgr.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { IContributionItem[] items = getViewSite().getActionBars().getToolBarManager().getItems(); for (int i = 0; i < items.length; i++) { if (items[i] instanceof ActionContributionItem) { ActionContributionItem aci = (ActionContributionItem) items[i]; manager.add(aci.getAction()); } } } }); menuMgr.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); // Allow // other // plugins // to // add // here Menu menu = menuMgr.createContextMenu(gemViewer.getControl()); gemViewer.getControl().setMenu(menu); getSite().registerContextMenu(menuMgr, gemViewer); } public void gemsRefreshed() { doRefresh(); } public void gemUpdated(Gem gem) { } private void doRefresh() { Display.getDefault().asyncExec(new Runnable() { public void run() { gemViewer.setInput(getSortedGems()); gemViewer.refresh(); } }); } private Set<Gem> getSortedGems() { return Collections.unmodifiableSortedSet(new TreeSet<Gem>(getGemManager().getGems())); } public void gemAdded(final Gem gem) { doRefresh(); } public void gemRemoved(final Gem gem) { doRefresh(); } public void managerInitialized() { // ignore } public void setGemManager(IGemManager gemManager) { this.gemManager = gemManager; doRefresh(); } }