/******************************************************************************* * Copyright (c) 2012 - 2013 VMware, Inc. * 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: * VMware, Inc. - initial API and implementation *******************************************************************************/ package org.springframework.ide.eclipse.roo.ui.internal; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.Separator; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.forms.events.HyperlinkAdapter; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.widgets.Hyperlink; import org.eclipse.ui.part.ViewPart; import org.springframework.ide.eclipse.roo.ui.internal.actions.CreateNewRooProjectAction; import org.springframework.ide.eclipse.roo.ui.internal.actions.OpenRooCommandWizardAction; import org.springframework.ide.eclipse.roo.ui.internal.actions.OpenRooShellForProjectsAction; import org.springframework.ide.eclipse.roo.ui.internal.actions.RooAddOnManagerAction; /** * Entry-point for the Roo Shell. * @author Christian Dupuis * @author Kris De Volder * @since 2.5.0 */ public class RooShellView extends ViewPart { public static final String VIEW_ID = "com.springsource.sts.roo.ui.rooShellView"; private CreateNewRooProjectAction createNewRooProject; private CTabFolder folder = null; private CTabItem infoTab; private OpenRooCommandWizardAction openRooCommandWizardAction; private OpenRooShellForProjectsAction openRooProjectsAction; private IResourceChangeListener projectChangeListener = null; private final Map<IProject, CTabItem> tabItems = new ConcurrentHashMap<IProject, CTabItem>(); private final Map<IProject, RooShellTab> tabs = new ConcurrentHashMap<IProject, RooShellTab>(); private RooAddOnManagerAction openRooAddOnManagerAction; @Override public void createPartControl(Composite parent) { folder = new CTabFolder(parent, SWT.BOTTOM | SWT.BORDER); Composite tabComposite = new Composite(folder, SWT.NONE); tabComposite.setFont(folder.getFont()); GridLayout layout = new GridLayout(1, false); tabComposite.setLayout(layout); tabComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); Hyperlink loginLink = new Hyperlink(tabComposite, SWT.NONE); loginLink.setText("Open Roo Shell for projects..."); loginLink.setUnderlined(true); loginLink.setForeground(getViewSite().getShell().getDisplay().getSystemColor(SWT.COLOR_BLUE)); loginLink.addHyperlinkListener(new HyperlinkAdapter() { @Override public void linkActivated(HyperlinkEvent e) { openRooProjectsAction.run(); } }); infoTab = new CTabItem(folder, SWT.CLOSE); infoTab.setText("Info"); infoTab.setShowClose(false); infoTab.setControl(tabComposite); folder.setSelection(infoTab); createToolbar(); } @Override public void dispose() { for (IProject entry : tabItems.keySet()) { removeTab(entry); } // should not be necessary and causes an SWTException on Gtk // if (folder != null && !folder.isDisposed()) { // folder.dispose(); // } super.dispose(); } public IProject getActiveProject() { CTabItem item = folder.getSelection(); for (Map.Entry<IProject, CTabItem> tabItem : tabItems.entrySet()) { if (tabItem.getValue().equals(item)) { return tabItem.getKey(); } } return null; } public Set<IProject> getOpenProjects() { return tabs.keySet(); } public synchronized RooShellTab openShell(IProject project) { return openShell(project, null); } public synchronized RooShellTab openShell(IProject project, String command) { ensureProjectListener(); if (infoTab != null) { infoTab.dispose(); infoTab = null; } if (!tabs.containsKey(project)) { RooShellTab tab = new RooShellTab(project, command, this); tabs.put(project, tab); CTabItem tabItem = tab.addTab(folder); tabItems.put(project, tabItem); openRooCommandWizardAction.update(); openRooAddOnManagerAction.update(); return tab; } else { folder.setSelection(tabItems.get(project)); openRooCommandWizardAction.update(); openRooAddOnManagerAction.update(); return tabs.get(project); } } @Override public void setFocus() { } private void createToolbar() { IToolBarManager mgr = getViewSite().getActionBars().getToolBarManager(); openRooCommandWizardAction = new OpenRooCommandWizardAction(this); mgr.add(openRooCommandWizardAction); openRooAddOnManagerAction = new RooAddOnManagerAction(this); mgr.add(openRooAddOnManagerAction); mgr.add(new Separator()); openRooProjectsAction = new OpenRooShellForProjectsAction(this); mgr.add(openRooProjectsAction); mgr.add(new Separator()); createNewRooProject = new CreateNewRooProjectAction(getSite().getShell()); mgr.add(createNewRooProject); } private void ensureProjectListener() { if (this.projectChangeListener==null) { this.projectChangeListener = new IResourceChangeListener() { public void resourceChanged(IResourceChangeEvent event) { final IProject project = (IProject) event.getResource(); if (folder!=null && !folder.isDisposed()) { folder.getDisplay().syncExec(new Runnable() { public void run() { removeTab(project); } }); } } }; ResourcesPlugin.getWorkspace().addResourceChangeListener( this.projectChangeListener, IResourceChangeEvent.PRE_CLOSE + IResourceChangeEvent.PRE_DELETE); } } protected void removeTab(IProject project) { tabs.remove(project); CTabItem item = tabItems.remove(project); if (item != null) { item.dispose(); } openRooCommandWizardAction.update(); openRooAddOnManagerAction.update(); } }