/** * This file Copyright (c) 2005-2010 Aptana, Inc. This program is * dual-licensed under both the Aptana Public License and the GNU General * Public license. You may elect to use one or the other of these licenses. * * This program is distributed in the hope that it will be useful, but * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or * NONINFRINGEMENT. Redistribution, except as permitted by whichever of * the GPL or APL you select, is prohibited. * * 1. For the GPL license (GPL), you can redistribute and/or modify this * program under the terms of the GNU General Public License, * Version 3, as published by the Free Software Foundation. You should * have received a copy of the GNU General Public License, Version 3 along * with this program; if not, write to the Free Software Foundation, Inc., 51 * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Aptana provides a special exception to allow redistribution of this file * with certain other free and open source software ("FOSS") code and certain additional terms * pursuant to Section 7 of the GPL. You may view the exception and these * terms on the web at http://www.aptana.com/legal/gpl/. * * 2. For the Aptana Public License (APL), this program and the * accompanying materials are made available under the terms of the APL * v1.0 which accompanies this distribution, and is available at * http://www.aptana.com/legal/apl/. * * You may view the GPL, Aptana's exception and additional terms, and the * APL in the file titled license.html at the root of the corresponding * plugin containing this source file. * * Any modifications to this file must keep this entire header intact. */ package com.aptana.ide.core.ui; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.custom.ViewForm; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IPartListener; import org.eclipse.ui.IPerspectiveDescriptor; import org.eclipse.ui.IPerspectiveListener; import org.eclipse.ui.IWindowListener; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.internal.EditorAreaHelper; import org.eclipse.ui.internal.LayoutPart; import org.eclipse.ui.internal.Perspective; import org.eclipse.ui.internal.WorkbenchPage; import org.eclipse.ui.navigator.CommonNavigator; import com.aptana.ide.core.IdeLog; import com.aptana.ide.core.db.EventInfo; import com.aptana.ide.core.db.EventLogger; import com.aptana.ide.core.ui.preferences.IPreferenceConstants; /** * @author Ingo Muschenetz */ @SuppressWarnings("restriction") public class InitialStartup { private static final String EDITORAREA_CUSTOM_PAINT = "editorarea.custom_paint"; //$NON-NLS-1$ /** * perpListener */ private static IPerspectiveListener perpListener; private static Image editorAreaImage; private static Image editorAreaImage_studio; private static Image editorAreaImage_radrails; private static PaintListener paintListener = new PaintListener() { public void paintControl(PaintEvent e) { Rectangle rect = ((Composite) e.widget).getClientArea(); Rectangle imageSize = editorAreaImage.getBounds(); int drawWidth; int drawHeight; if (rect.width > imageSize.width && rect.height > imageSize.height) { drawWidth = imageSize.width; drawHeight = imageSize.height; } else if (rect.width * imageSize.height > rect.height * imageSize.width) { drawHeight = rect.height; drawWidth = (drawHeight * imageSize.width) / imageSize.height; } else { drawWidth = rect.width; drawHeight = (drawWidth * imageSize.height) / imageSize.width; } e.gc.drawImage(editorAreaImage, 0, 0, imageSize.width, imageSize.height, (rect.width - drawWidth) / 2, (rect.height - drawHeight) / 2, drawWidth, drawHeight); } }; /** * windows */ private static Map<IWorkbenchWindow, IPerspectiveListener> windows = new HashMap<IWorkbenchWindow, IPerspectiveListener>(); public static void start() { ImageDescriptor imageDescriptor = CoreUIPlugin.getImageDescriptor("icons/editorarea.gif"); //$NON-NLS-1$ if (imageDescriptor != null) { editorAreaImage_studio = imageDescriptor.createImage(); editorAreaImage = editorAreaImage_studio; } ImageDescriptor imageDescriptor_radrails = CoreUIPlugin.getImageDescriptor("icons/editorarea_radrails.gif"); //$NON-NLS-1$ if (imageDescriptor_radrails != null) { editorAreaImage_radrails = imageDescriptor_radrails.createImage(); } IPreferenceStore prefs = CoreUIPlugin.getDefault().getPreferenceStore(); boolean hasRunFirstStartup = prefs.getBoolean(IPreferenceConstants.PREF_KEY_FIRST_STARTUP); if (!hasRunFirstStartup) { initForFirstTimeStartup(); prefs.setValue(IPreferenceConstants.PREF_KEY_FIRST_STARTUP, true); } final IWorkbench workbench = PlatformUI.getWorkbench(); perpListener = new IPerspectiveListener() { public void perspectiveActivated(IWorkbenchPage page, IPerspectiveDescriptor perspective) { recordPerspectiveActivation(perspective); checkPerspective(page, perspective); setEditorAreaPaintListener(page); } public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, String changeId) { } }; PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { public void run() { IWorkbenchWindow w = workbench.getActiveWorkbenchWindow(); addListenerToWindow(w); } }); addWindowListener(workbench); final IPartListener _partListener = createPartActivationListener(); PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { public void run() { IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); if (window != null) { window.getPartService().addPartListener(_partListener); } } }); } protected static void recordPerspectiveActivation(IPerspectiveDescriptor perspective) { String keyName = "perspective.activated"; EventInfo[] events = EventLogger.getInstance().getEvents(keyName); String perspectiveId = perspective.getId(); if (events != null && events.length > 0) { for (EventInfo event : events) { String msg = event.getMessage(); if (msg != null && msg.equals(perspectiveId)) return; } } EventLogger.getInstance().logEvent(keyName, perspectiveId); } /** * Creates a new window listener to the workbench, and adds a new perspective listener on window activation (if not * already added, and removes it on deactivation * * @param workbench */ private static void addWindowListener(final IWorkbench workbench) { workbench.addWindowListener(new IWindowListener() { public void windowActivated(IWorkbenchWindow window) { } public void windowDeactivated(IWorkbenchWindow window) { } public void windowClosed(IWorkbenchWindow window) { window.removePerspectiveListener(perpListener); if (windows.containsKey(window)) { windows.remove(window); } } public void windowOpened(IWorkbenchWindow window) { if (!windows.containsKey(window)) { addListenerToWindow(window); windows.put(window, perpListener); } } }); } /** * createPartActivationListener * * @return IPartListener */ private static IPartListener createPartActivationListener() { final IPartListener _partListener = new IPartListener() { public void partActivated(IWorkbenchPart part) { try { IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); if (part.getSite().getPart() instanceof CommonNavigator) { if (page instanceof WorkbenchPage) { WorkbenchPage wp = (WorkbenchPage) page; Perspective persp = wp.getActivePerspective(); if (WebPerspectiveFactory.isSameOrDescendantPerspective(persp.getDesc())) { // Remove the Untitled file wizards, add the project-based new file wizards String[] existing = persp.getNewWizardShortcuts(); List<String> fileWizards = WebPerspectiveFactory.getFileWizardShortcuts(); ArrayList<String> ids = new ArrayList<String>(); for (int i = 0; i < existing.length; i++) { if (fileWizards.contains(existing[i])) continue; ids.add(existing[i]); } List<String> projectWizards = WebPerspectiveFactory.getProjectWizardShortcuts(); for (String id : projectWizards) { if (!ids.contains(id)) ids.add(id); } persp.setNewWizardActionIds(ids); } } } } catch (Exception ex) { IdeLog.logError(CoreUIPlugin.getDefault(), Messages.InitialStartup_UnableToSwitchNewFileWizardListing, ex); } } public void partDeactivated(IWorkbenchPart part) { try { IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); if (part.getSite().getPart() instanceof CommonNavigator) { WorkbenchPage wp = (WorkbenchPage) page; Perspective persp = wp.getActivePerspective(); if (WebPerspectiveFactory.isSameOrDescendantPerspective(persp.getDesc())) { // Remove the project-based new file wizards, add Untitled file wizards String[] existing = persp.getNewWizardShortcuts(); List<String> projectWizards = WebPerspectiveFactory.getProjectWizardShortcuts(); ArrayList<String> ids = new ArrayList<String>(); for (int i = 0; i < existing.length; i++) { if (projectWizards.contains(existing[i])) continue; ids.add(existing[i]); } List<String> fileWizards = WebPerspectiveFactory.getFileWizardShortcuts(); for (String id : fileWizards) { if (!ids.contains(id)) ids.add(id); } persp.setNewWizardActionIds(ids); } } } catch (Exception ex) { IdeLog.logError(CoreUIPlugin.getDefault(), Messages.InitialStartup_UnableToSwitchNewFileWizardListing, ex); } } public void partBroughtToTop(IWorkbenchPart part) { } public void partOpened(IWorkbenchPart part) { } public void partClosed(IWorkbenchPart part) { } }; return _partListener; } /** * Adds the perspective listener to the current window * * @param w */ private static void addListenerToWindow(final IWorkbenchWindow w) { if (w == null) { return; } IWorkbenchPage page = w.getActivePage(); if (page != null) { checkPerspective(page, page.getPerspective()); w.addPerspectiveListener(perpListener); w.getPartService().addPartListener(new IPartListener() { public void partActivated(IWorkbenchPart part) { } public void partBroughtToTop(IWorkbenchPart part) { } public void partClosed(IWorkbenchPart part) { IWorkbenchPage page = w.getActivePage(); if (part instanceof IEditorPart && page != null && page.getEditorReferences().length == 0) { setEditorAreaPaintListener(page); } } public void partDeactivated(IWorkbenchPart part) { } public void partOpened(IWorkbenchPart part) { } }); setEditorAreaPaintListener(page); } } /** * Checks to see if we are in the web perspective * * @param page * @param perspective */ private static boolean checkPerspective(IWorkbenchPage page, IPerspectiveDescriptor perspective) { if (WebPerspectiveFactory.isSameOrDescendantPerspective(perspective)) { onWebPerspectiveActivated(page); return true; } return false; } /** * Run whenever the web perspective is activated * * @param page * @param listener */ private static void onWebPerspectiveActivated(IWorkbenchPage page) { IPreferenceStore prefs = CoreUIPlugin.getDefault().getPreferenceStore(); int lastWorkspace = prefs.getInt(IPreferenceConstants.WEB_PERSPECTIVE_LAST_VERSION); if (WebPerspectiveFactory.VERSION > lastWorkspace) { prefs.setValue(IPreferenceConstants.WEB_PERSPECTIVE_LAST_VERSION, WebPerspectiveFactory.VERSION); prefs.setValue(IPreferenceConstants.WEB_PERSPECTIVE_RESET_PERSPECTIVE, false); WebPerspectiveFactory.resetPerspective(page); } } /** * Runs the first time startup logic for this workspace. */ private static void initForFirstTimeStartup() { IPreferenceStore prefs = CoreUIPlugin.getDefault().getPreferenceStore(); // Set here so that a new user does not immediately get a "perspective has changed" warning prefs.setValue(IPreferenceConstants.WEB_PERSPECTIVE_LAST_VERSION, WebPerspectiveFactory.VERSION); } private static void setEditorAreaPaintListener(IWorkbenchPage page) { if (editorAreaImage_studio == null && editorAreaImage_radrails == null) { return; } ViewForm control = null; EditorAreaHelper editorAreaHelper = ((WorkbenchPage) page).getEditorPresentation(); if (editorAreaHelper == null) { return; } LayoutPart layoutPart = editorAreaHelper.getWorkbookFromID("DefaultEditorWorkbook"); if (layoutPart == null) { return; } Control[] list = ((Composite) layoutPart.getControl()).getChildren(); //$NON-NLS-1$ for (int i = 0; i < list.length; ++i) { if (list[i] instanceof ViewForm) { control = (ViewForm) list[i]; break; } } if (control == null) { return; } IPerspectiveDescriptor perspective = page.getPerspective(); if (WebPerspectiveFactory.isSameOrDescendantPerspective(perspective) || perspective.getId().equals(WebPerspectiveFactory.RAILS_PERSPECTIVE_ID) || perspective.getId().equals(WebPerspectiveFactory.RUBY_PERSPECTIVE_ID)) { if (perspective.getId().equals(WebPerspectiveFactory.RAILS_PERSPECTIVE_ID) || perspective.getId().equals(WebPerspectiveFactory.RUBY_PERSPECTIVE_ID)) { editorAreaImage = editorAreaImage_radrails; } else if (WebPerspectiveFactory.isSameOrDescendantPerspective(perspective)) { editorAreaImage = editorAreaImage_studio; } if (control.getData(EDITORAREA_CUSTOM_PAINT) != null) { return; } control.addPaintListener(paintListener); control.setData(EDITORAREA_CUSTOM_PAINT, Boolean.TRUE); control.redraw(); } else { if (control.getData(EDITORAREA_CUSTOM_PAINT) == null) { return; } control.removePaintListener(paintListener); control.setData(EDITORAREA_CUSTOM_PAINT, null); control.redraw(); } } }