/** * This file Copyright (c) 2005-2008 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.editor.html; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeMap; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.Command; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.QualifiedName; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.preference.PreferenceDialog; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.dnd.Clipboard; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; 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.MenuItem; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; import org.eclipse.ui.IEditorActionBarContributor; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.IKeyBindingService; import org.eclipse.ui.IPropertyListener; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPartSite; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.commands.ICommandService; import org.eclipse.ui.contexts.IContextService; import org.eclipse.ui.dialogs.PreferencesUtil; import org.eclipse.ui.handlers.IHandlerService; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.internal.EditorSite; import org.eclipse.ui.internal.PopupMenuExtender; import org.eclipse.ui.keys.IBindingService; import org.eclipse.ui.part.FileEditorInput; import org.eclipse.ui.part.MultiPageEditorPart; import org.eclipse.ui.part.MultiPageEditorSite; import org.eclipse.ui.part.MultiPageSelectionProvider; import org.eclipse.ui.progress.UIJob; import org.eclipse.ui.texteditor.IElementStateListener; import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds; import com.aptana.ide.core.IdeLog; import com.aptana.ide.core.StringUtils; import com.aptana.ide.core.ui.CoreUIUtils; import com.aptana.ide.editor.css.CSSPlugin; import com.aptana.ide.editor.html.preferences.IPreferenceConstants; import com.aptana.ide.editor.html.preview.ContributedPreviewPage; import com.aptana.ide.editor.html.preview.DefaultPreviewConfigurationPage; import com.aptana.ide.editor.html.preview.HTMLPreviewPropertyPage; import com.aptana.ide.editor.html.preview.IBrowserTabAdder; import com.aptana.ide.editor.html.preview.IPreviewConfigurationPage; import com.aptana.ide.editor.html.preview.PreviewConfigurationPage; import com.aptana.ide.editor.html.preview.PreviewTabManager; import com.aptana.ide.editors.UnifiedEditorsPlugin; import com.aptana.ide.editors.unified.ContributedBrowser; import com.aptana.ide.editors.unified.ContributedOutline; /** The tabbed style HTML editor. */ public class MultiPageHTMLEditor extends MultiPageEditorPart implements IHTMLEditorPart { /** HTML source editor */ private HTMLSourceEditor editor; private IEditorInput _page0; /** wrapper */ private HTMLEditor wrapper; private boolean isDisposing = false; private SourceEditorSite _siteEditor; /** * Tab actions control - the following flags control wheather the tab * actions are shown */ private boolean addPreviewCapable = true; private boolean removePreviewCapable = true; private boolean editPreviewCapable = true; /** * Tab actions */ private ToolItem addToolItem; private MenuItem addMenuItem; private ToolItem removeToolItem; private MenuItem removeMenuItem; private ToolItem editToolItem; private MenuItem editMenuItem; private ToolItem refreshToolItem; private MenuItem refreshMenuItem; private MenuItem copyURLMenuItem; private MenuItem openInBrowserMenuItem; private MenuItem viewSourceMenuItem; private IElementStateListener elementListener = new IElementStateListener() { public void elementMoved(Object originalElement, Object movedElement) { } public void elementDirtyStateChanged(Object element, boolean isDirty) { } public void elementDeleted(Object element) { if (element.equals(getEditorInput())) { IWorkbenchPartSite site = MultiPageHTMLEditor.this.getSite(); if (site == null) { return; } IWorkbenchWindow window = site.getWorkbenchWindow(); if (window == null) { return; } IWorkbenchPage page = window.getActivePage(); if (page == null) { return; } page.closeEditor(MultiPageHTMLEditor.this, true); } } public void elementContentReplaced(Object element) { } public void elementContentAboutToBeReplaced(Object element) { } }; private IPropertyListener propertyListener = new IPropertyListener() { public void propertyChanged(Object source, int propId) { if (propId == IEditorPart.PROP_INPUT && source instanceof HTMLSourceEditor) { IEditorInput newInput = ((HTMLSourceEditor) source) .getEditorInput(); if (newInput != null) { setInput(newInput); setPartName(newInput.getName()); setTitleToolTip(newInput.getToolTipText()); updateSourceTabTooltip(); } } } }; /** Manually created preview pages */ private Map<String, IPreviewConfigurationPage> previews; private String url; /** * MultiPageHTMLEditor * * @param wrapper * @param editor */ public MultiPageHTMLEditor(HTMLEditor wrapper, HTMLSourceEditor editor) { super(); previews = new TreeMap<String, IPreviewConfigurationPage>( new Comparator<String>() { public int compare(String o1, String o2) { int i1 = Integer.parseInt(o1); int i2 = Integer.parseInt(o2); return i1 - i2; } }); if (wrapper == null) { throw new IllegalArgumentException( Messages.MultiPageHTMLEditor_WrapperCannotBeNull); } if (editor == null) { throw new IllegalArgumentException( Messages.MultiPageHTMLEditor_EditorCannotBeNull); } this.wrapper = wrapper; this.editor = editor; } /** * Tab actions control - the following flags control wheather the tab * actions are shown */ public boolean isAddPreviewCapable() { return addPreviewCapable; } public void setAddPreviewCapable(boolean addPreviewCapable) { this.addPreviewCapable = addPreviewCapable; } public boolean isRemovePreviewCapable() { return removePreviewCapable; } public void setRemovePreviewCapable(boolean removePreviewCapable) { this.removePreviewCapable = removePreviewCapable; } public boolean isEditPreviewCapable() { return editPreviewCapable; } public void setEditPreviewCapable(boolean editPreviewCapable) { this.editPreviewCapable = editPreviewCapable; } /** * @param actionID * @return - true if the action was run for the id */ public boolean run(String actionID) { if (IWorkbenchActionDefinitionIds.CUT.equals(actionID) || IWorkbenchActionDefinitionIds.PASTE.equals(actionID) || IWorkbenchActionDefinitionIds.COPY.equals(actionID)) { if (getActivePage() != 0) { IPreviewConfigurationPage page = previews.get(Integer .toString(getActivePage())); return page.run(actionID); } } return false; } /** * @see com.aptana.ide.editor.html.IHTMLEditorPart#getBrowser2() */ public Browser getBrowser2() { return null; } /** * @see com.aptana.ide.editor.html.IHTMLEditorPart#getSourceEditor() */ public HTMLSourceEditor getSourceEditor() { return editor; } /** * @see org.eclipse.ui.part.MultiPageEditorPart#createSite(org.eclipse.ui.IEditorPart) */ protected IEditorSite createSite(IEditorPart editor) { this._siteEditor = new SourceEditorSite(this, editor, getEditorSite()); return _siteEditor; } private void updateSourceTabTooltip() { if (getContainer() instanceof CTabFolder && !getContainer().isDisposed()) { CTabFolder tabs = (CTabFolder) getContainer(); IEditorInput input = getEditorInput(); if (input instanceof IFileEditorInput) { IFile file = ((IFileEditorInput) input).getFile(); if (file != null) { IPath location = file.getLocation(); if (location != null && !CoreUIUtils.onMacOSX) { tabs.getItem(0).setToolTipText( location.makeAbsolute().toOSString()); } } } } } private void createPage0() { try { _page0 = getEditorInput(); int index = addPage(editor, _page0); setPageText(index, " Source "); //$NON-NLS-1$ setPartName(getEditorInput().getName()); updateSourceTabTooltip(); this.editor.addPropertyListener(propertyListener); this.editor.getDocumentProvider().addElementStateListener( elementListener); } catch (PartInitException e) { ErrorDialog.openError(getSite().getShell(), "Error creating nested text editor", null, e.getStatus()); //$NON-NLS-1$ } } private void createRefreshTabOption(ToolBar tb, Menu popupMenu) { refreshToolItem = new ToolItem(tb, SWT.PUSH); refreshToolItem.setImage(HTMLPlugin.getImage("icons/refresh.gif")); //$NON-NLS-1$ refreshToolItem .setToolTipText(Messages.MultiPageHTMLEditor_RefreshActivePreview); SelectionAdapter addSelectionAdapter = new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { String active = Integer.toString(getActivePage()); if (previews.containsKey(active)) { IPreviewConfigurationPage page = previews.get(active); if (getContainer() instanceof CTabFolder) { CTabFolder tabs = (CTabFolder) getContainer(); if (page instanceof DefaultPreviewConfigurationPage) { tabs.getItem(Integer.parseInt(active)).setImage( null); //$NON-NLS-1$ } else if (page.getTabImage() != null) { tabs.getItem(Integer.parseInt(active)).setImage( page.getTabImage()); //$NON-NLS-1$ } else { tabs .getItem(Integer.parseInt(active)) .setImage( HTMLPlugin .getImage("icons/add_tab_decorator.png")); //$NON-NLS-1$ } } page.refresh(); } } }; refreshToolItem.addSelectionListener(addSelectionAdapter); refreshToolItem.setEnabled(false); refreshMenuItem = new MenuItem(popupMenu, SWT.PUSH); refreshMenuItem.addSelectionListener(addSelectionAdapter); refreshMenuItem .setText(Messages.MultiPageHTMLEditor_RefreshActivePreview); refreshMenuItem.setImage(HTMLPlugin.getImage("icons/refresh.gif")); //$NON-NLS-1$ refreshMenuItem.setEnabled(false); } private void createAddTabOption(ToolBar tb, Menu popupMenu) { addToolItem = new ToolItem(tb, SWT.PUSH); addToolItem.setImage(HTMLPlugin.getImage("icons/add_tab.gif")); //$NON-NLS-1$ addToolItem.setToolTipText(Messages.MultiPageHTMLEditor_AddNewPreview); SelectionAdapter addSelectionAdapter = new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { PreviewConfigurationPage page = new PreviewConfigurationPage( MultiPageHTMLEditor.this); page.setType(HTMLPreviewPropertyPage.FILE_BASED_TYPE); page.setValue(null); page.createControl(getContainer()); int index = addPage(page.getControl()); Composite container = getContainer(); if (container instanceof CTabFolder) { ((CTabFolder) container).getItem(index).setImage( HTMLPlugin.getImage("icons/add_tab_decorator.png")); //$NON-NLS-1$ } previews.put(Integer.toString(index), page); page.setIndex(index); page.setTitle(page.generateNewPreviewName()); setPageText(index, " " + page.getTitle() + " "); //$NON-NLS-1$ //$NON-NLS-2$ setActivePage(index); page.showEditArea(); if (isEditPreviewCapable()) { editToolItem.setEnabled(true); editMenuItem.setEnabled(true); } if (isRemovePreviewCapable()) { removeToolItem.setEnabled(true); removeMenuItem.setEnabled(true); } } }; addToolItem.addSelectionListener(addSelectionAdapter); addMenuItem = new MenuItem(popupMenu, SWT.PUSH); addMenuItem.addSelectionListener(addSelectionAdapter); addMenuItem.setText(Messages.MultiPageHTMLEditor_AddNewPreview); addMenuItem.setImage(HTMLPlugin.getImage("icons/add_tab.gif")); //$NON-NLS-1$ } private void createEditTabOption(ToolBar tb, Menu popupMenu) { editToolItem = new ToolItem(tb, SWT.PUSH); editToolItem.setImage(HTMLPlugin.getImage("icons/edit.png")); //$NON-NLS-1$ editToolItem .setToolTipText(Messages.MultiPageHTMLEditor_EditActivePreview); SelectionAdapter editSelectionAdapter = new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { String active = Integer.toString(getActivePage()); if (previews.containsKey(active)) { IPreviewConfigurationPage page = previews.get(active); if (page instanceof DefaultPreviewConfigurationPage) { if (getEditorInput() instanceof IFileEditorInput) { IFile file = ((IFileEditorInput) getEditorInput()) .getFile(); PreferenceDialog dialog = PreferencesUtil .createPropertyDialogOn( Display.getDefault() .getActiveShell(), file.getProject(), "com.aptana.ide.editor.html.preview.htmlPreviewPropertyPage", //$NON-NLS-1$ new String[] { "com.aptana.ide.editor.html.preview.htmlPreviewPropertyPage" }, //$NON-NLS-1$ null); dialog.open(); } else { PreferenceDialog dialog = PreferencesUtil .createPreferenceDialogOn( Display.getDefault() .getActiveShell(), "com.aptana.ide.editor.html.preferences.PreviewPreferencePage", //$NON-NLS-1$ new String[] { "com.aptana.ide.editor.html.preferences.PreviewPreferencePage" }, //$NON-NLS-1$ null); dialog.open(); } } else if (!page.isReadOnly()) { page.showEditArea(); } } } }; editToolItem.addSelectionListener(editSelectionAdapter); editToolItem.setEnabled(false); editMenuItem = new MenuItem(popupMenu, SWT.PUSH); editMenuItem.addSelectionListener(editSelectionAdapter); editMenuItem.setImage(HTMLPlugin.getImage("icons/edit.png")); //$NON-NLS-1$ editMenuItem.setText(Messages.MultiPageHTMLEditor_EditActivePreview); editMenuItem.setEnabled(false); } private void createRemoveTabOption(ToolBar tb, Menu popupMenu) { removeToolItem = new ToolItem(tb, SWT.PUSH); removeToolItem.setImage(HTMLPlugin.getImage("icons/delete.gif")); //$NON-NLS-1$ removeToolItem .setToolTipText(Messages.MultiPageHTMLEditor_RemoveActivePreview); SelectionAdapter removeSelectionAdapter = new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { int pageIndex = getActivePage(); String active = Integer.toString(pageIndex); previews.remove(active); for (int i = pageIndex + 1; i < getPageCount(); i++) { if (previews.containsKey(Integer.toString(i))) { IPreviewConfigurationPage obj = previews.remove(Integer .toString(i)); previews.put(Integer.toString(i - 1), obj); } } removePage(pageIndex); savePreviewsPages(); } }; removeToolItem.addSelectionListener(removeSelectionAdapter); removeToolItem.setEnabled(false); removeMenuItem = new MenuItem(popupMenu, SWT.PUSH); removeMenuItem.addSelectionListener(removeSelectionAdapter); removeMenuItem.setImage(HTMLPlugin.getImage("icons/delete.gif")); //$NON-NLS-1$ removeMenuItem .setText(Messages.MultiPageHTMLEditor_RemoveActivePreview); removeMenuItem.setEnabled(false); } private void createCopyURLTabOption(Menu popupMenu) { SelectionAdapter copySelectionAdapter = new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { String active = Integer.toString(getActivePage()); if (previews.containsKey(active)) { IPreviewConfigurationPage page = previews.get(active); Clipboard cb = new Clipboard(e.display); cb.setContents(new Object[] { page.getURL() }, new Transfer[] { TextTransfer.getInstance() }); cb.dispose(); } } }; copyURLMenuItem = new MenuItem(popupMenu, SWT.PUSH); copyURLMenuItem.addSelectionListener(copySelectionAdapter); copyURLMenuItem.setImage(HTMLPlugin.getImage("icons/copy_edit.gif")); //$NON-NLS-1$ copyURLMenuItem.setText(Messages.MultiPageHTMLEditor_CopyPreviewURL); copyURLMenuItem.setEnabled(false); } private void createOpenInBrowserTabOption(Menu popupMenu) { SelectionAdapter openSelectionAdapter = new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { String active = Integer.toString(getActivePage()); if (previews.containsKey(active)) { IPreviewConfigurationPage page = previews.get(active); CoreUIUtils.openBrowserURL(page.getURL()); } } }; openInBrowserMenuItem = new MenuItem(popupMenu, SWT.PUSH); openInBrowserMenuItem.addSelectionListener(openSelectionAdapter); openInBrowserMenuItem .setText(Messages.MultiPageHTMLEditor_OpenInExternalBrowser); openInBrowserMenuItem.setEnabled(false); } private void createViewSourceTabOption(Menu popupMenu) { SelectionAdapter viewSourceAdapter = new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { String active = Integer.toString(getActivePage()); if (previews.containsKey(active)) { IPreviewConfigurationPage page = previews.get(active); page.viewSource(); } } }; viewSourceMenuItem = new MenuItem(popupMenu, SWT.PUSH); viewSourceMenuItem.addSelectionListener(viewSourceAdapter); viewSourceMenuItem.setText(Messages.MultiPageHTMLEditor_LBL_ViewSource); viewSourceMenuItem.setEnabled(false); } /* * private void createPage2() { if(isFileEditorInput()){ browser2 = new * Browser(getContainer(),SWT.NONE); browser2.addLocationListener(new * LocationListener() { public void changing(LocationEvent event) { } public * void changed(LocationEvent event) { * if(event.location.endsWith("edit.htm")) wrapper.updateEdit(); } }); int * index = addPage(browser2); setPageText(index, "Edit"); //$NON-NLS-1$ } } */ /* (non-Javadoc) * @see org.eclipse.ui.part.MultiPageEditorPart#getActivePage() */ public int getActivePage() { return super.getActivePage(); } /** * @see org.eclipse.ui.part.MultiPageEditorPart#createPages() */ protected void createPages() { // The following code enables the new preview model which allows pages // to be added and removed // It was commented out since it was not part of 1.0 and will go out for // 1.1 // getSite().setSelectionProvider(new MultiPageSelectionProvider(this)); if (getContainer() instanceof CTabFolder) { final CTabFolder tabs = (CTabFolder) getContainer(); registerTabItemTraversal(getSite(), tabs); Menu popupMenu = new Menu(tabs); Composite toolbar = new Composite(tabs, SWT.NONE); toolbar.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false)); GridLayout layout = new GridLayout(2, false); ToolBar tb = new ToolBar(toolbar, SWT.FLAT); tb.setMenu(popupMenu); tabs.setTabHeight(21); layout.marginWidth = 0; layout.marginHeight = 0; toolbar.setLayout(layout); tb.setLayout(layout); tb.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); if (isAddPreviewCapable()) { createAddTabOption(tb, popupMenu); } if (isEditPreviewCapable()) { createEditTabOption(tb, popupMenu); } if (isRemovePreviewCapable()) { createRemoveTabOption(tb, popupMenu); } createRefreshTabOption(tb, popupMenu); createCopyURLTabOption(popupMenu); createOpenInBrowserTabOption(popupMenu); createViewSourceTabOption(popupMenu); tabs.setMenu(popupMenu); tabs.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { String active = Integer.toString(MultiPageHTMLEditor.this.getActivePage()); if (previews.containsKey(active)) { IPreviewConfigurationPage page = previews.get(active); if (isRemovePreviewCapable()) { removeToolItem.setEnabled(page.isDeletable()); removeMenuItem.setEnabled(page.isDeletable()); } if (isEditPreviewCapable()) { editToolItem .setEnabled(page instanceof DefaultPreviewConfigurationPage || !page.isReadOnly()); editMenuItem.setEnabled(true); } copyURLMenuItem.setEnabled(true); openInBrowserMenuItem.setEnabled(true); viewSourceMenuItem.setEnabled(true); refreshMenuItem.setEnabled(true); refreshToolItem.setEnabled(true); } else { viewSourceMenuItem.setEnabled(false); if (isRemovePreviewCapable()) { removeToolItem.setEnabled(false); removeMenuItem.setEnabled(false); } if (isEditPreviewCapable()) { editToolItem.setEnabled(false); editMenuItem.setEnabled(false); } copyURLMenuItem.setEnabled(false); openInBrowserMenuItem.setEnabled(false); refreshMenuItem.setEnabled(false); refreshToolItem.setEnabled(false); } } }); Composite config = new Composite(toolbar, SWT.NONE); config .setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); layout = new GridLayout(1, false); final ToolBar configTb = new ToolBar(config, SWT.FLAT); GridData tbData = new GridData(GridData.HORIZONTAL_ALIGN_END); configTb.setLayoutData(tbData); layout.marginWidth = 0; layout.marginHeight = 0; config.setLayout(layout); configTb.setLayout(layout); final ToolItem configure = new ToolItem(configTb, SWT.DROP_DOWN); configure.setImage(CSSPlugin.getImage("icons/configure.gif")); //$NON-NLS-1$ configure .setToolTipText(Messages.MultiPageHTMLEditor_ConfigureHTMLPreview); configure.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { if (e.detail != SWT.ARROW) { if (getEditorInput() instanceof IFileEditorInput) { IFile file = ((IFileEditorInput) getEditorInput()) .getFile(); PreferenceDialog dialog = PreferencesUtil .createPropertyDialogOn( Display.getDefault() .getActiveShell(), file.getProject(), "com.aptana.ide.editor.html.preview.htmlPreviewPropertyPage", //$NON-NLS-1$ new String[] { "com.aptana.ide.editor.html.preview.htmlPreviewPropertyPage" }, //$NON-NLS-1$ null); dialog.open(); } else { PreferenceDialog dialog = PreferencesUtil .createPreferenceDialogOn( Display.getDefault() .getActiveShell(), "com.aptana.ide.editor.html.preferences.PreviewPreferencePage", //$NON-NLS-1$ new String[] { "com.aptana.ide.editor.html.preferences.PreviewPreferencePage" }, //$NON-NLS-1$ null); dialog.open(); } } } }); final Menu menu = new Menu(tabs.getShell(), SWT.POP_UP); if (getEditorInput() instanceof IFileEditorInput) { MenuItem editProjectSettings = new MenuItem(menu, SWT.PUSH); editProjectSettings .setText(Messages.MultiPageHTMLEditor_ProjectPreviewSettings); editProjectSettings .addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { if (getEditorInput() instanceof IFileEditorInput) { IFile file = ((IFileEditorInput) getEditorInput()) .getFile(); PreferenceDialog dialog = PreferencesUtil .createPropertyDialogOn( Display.getDefault() .getActiveShell(), file.getProject(), "com.aptana.ide.editor.html.preview.htmlPreviewPropertyPage", //$NON-NLS-1$ new String[] { "com.aptana.ide.editor.html.preview.htmlPreviewPropertyPage" }, //$NON-NLS-1$ null); dialog.open(); } } }); } MenuItem editWorkspaceSettings = new MenuItem(menu, SWT.PUSH); editWorkspaceSettings .setText(Messages.MultiPageHTMLEditor_WorkspacePreviewSettings); editWorkspaceSettings.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { PreferenceDialog dialog = PreferencesUtil .createPreferenceDialogOn( Display.getDefault().getActiveShell(), "com.aptana.ide.editor.html.preferences.PreviewPreferencePage", //$NON-NLS-1$ new String[] { "com.aptana.ide.editor.html.preferences.PreviewPreferencePage" }, null); //$NON-NLS-1$ dialog.open(); } }); MenuItem restoreDefaults = new MenuItem(menu, SWT.PUSH); restoreDefaults.setImage(HTMLPlugin .getImage("icons/restore_defaults.gif")); //$NON-NLS-1$ restoreDefaults .setText(Messages.MultiPageHTMLEditor_RestoreTabDefaults); restoreDefaults.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { while (getPageCount() > 1) { removePage(1); } IEditorInput input = getEditorInput(); if (input instanceof IFileEditorInput) { IFile file = ((IFileEditorInput) input).getFile(); try { file .setPersistentProperty( new QualifiedName( "", //$NON-NLS-1$ HTMLPreviewPropertyPage.HTML_PREVIEW_ADDON_BROWSERS), ""); //$NON-NLS-1$ file .setPersistentProperty( new QualifiedName( "", //$NON-NLS-1$ HTMLPreviewPropertyPage.HTML_PREVIEW_ADDON_URLS), ""); //$NON-NLS-1$ file .setPersistentProperty( new QualifiedName( "", //$NON-NLS-1$ HTMLPreviewPropertyPage.HTML_PREVIEW_ADDON_NAMES), ""); //$NON-NLS-1$ } catch (CoreException e1) { IdeLog.logInfo(HTMLPlugin.getDefault(), "Error saving preview page add-ons", e1); //$NON-NLS-1$ } } previews.clear(); loadPreviewPages(); savePreviewsPages(); } }); configure.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { if (e.detail == SWT.ARROW) { Rectangle rect = configure.getBounds(); Point pt = new Point(rect.x, rect.y + rect.height); pt = configTb.toDisplay(pt); menu.setLocation(pt.x, pt.y); menu.setVisible(true); } } }); tabs.setTopRight(toolbar, SWT.FILL); } createPage0(); // Obtain preview pages from preferences and build UIJob job = new UIJob(Messages.MultiPageHTMLEditor_Job_LoadingPreview) { @Override public IStatus runInUIThread(IProgressMonitor monitor) { loadPreviewPages(); wrapper.updatePreview(); return Status.OK_STATUS; } }; job.setSystem(true); job.setPriority(Job.LONG); job.schedule(); } private static void registerTabItemTraversal(IWorkbenchPartSite site, CTabFolder tabs) { ICommandService commandService = (ICommandService) site.getService(ICommandService.class); IHandlerService handlerService = (IHandlerService) site.getService(IHandlerService.class); IBindingService bindingService = (IBindingService) site.getService(IBindingService.class); IContextService contextService = (IContextService) site.getService(IContextService.class); } private void showFirefoxSafariConflictMessage() { MessageDialog.openInformation(PlatformUI.getWorkbench().getDisplay() .getActiveShell(), Messages.MultiPageHTMLEditor_EmbeddedFirefoxLoadingIssue, Messages.MultiPageHTMLEditor_FirefoxBrowserCantBeFirst); } private void showFirefoxSafariConflictMessageDuringSave( IPreviewConfigurationPage page) { MessageDialog .openInformation( PlatformUI.getWorkbench().getDisplay().getActiveShell(), Messages.MultiPageHTMLEditor_EmbeddedFirefoxLoadingIssue, StringUtils .format( Messages.MultiPageHTMLEditor_FirefoxBrowserCantBeFirstSave, page.getTitle())); } private void loadPreviewPages() { List<IConfigurationElement> browserList = null; IFile file = null; if (getEditorInput() instanceof FileEditorInput) { file = ((FileEditorInput) getEditorInput()).getFile(); String override; try { override = file .getProject() .getPersistentProperty( new QualifiedName( "", HTMLPreviewPropertyPage.HTML_PREVIEW_OVERRIDE)); //$NON-NLS-1$ if (HTMLPreviewPropertyPage.TRUE.equals(override)) { String browserString = file .getProject() .getPersistentProperty( new QualifiedName( "", HTMLPreviewPropertyPage.HTML_PREVIEW_BROWSERS)); //$NON-NLS-1$ if (browserString == null) { browserString = ""; //$NON-NLS-1$ } String[] browsers_names = browserString.split(","); //$NON-NLS-1$ browserList = BrowserExtensionLoader .getBrowsers(browsers_names); Collections.sort(browserList, new Comparator<IConfigurationElement>() { public int compare(IConfigurationElement o1, IConfigurationElement o2) { String name1 = BrowserExtensionLoader .getBrowserLabel(o1); String name2 = BrowserExtensionLoader .getBrowserLabel(o2); int compare = 0; if (name1 != null && name2 != null) { // This is to put the browsers in // reverse alphabetical order so Firefox // is always last // since // that affects loading on Mac OS X. // Basically 'Safari' must come before // 'Firefox' if (CoreUIUtils.onMacOSX) { return name2.compareTo(name1); } else { compare = name1.compareTo(name2); } } return compare; } }); } else { browserList = BrowserExtensionLoader.loadBrowsers(); } } catch (CoreException e) { browserList = BrowserExtensionLoader.loadBrowsers(); } } else { browserList = BrowserExtensionLoader.loadBrowsers(); } for (int j = 0; j < browserList.size(); j++) { IConfigurationElement element = (IConfigurationElement) browserList .get(j); String name = BrowserExtensionLoader.getBrowserLabel(element); IdeLog.logInfo(HTMLPlugin.getDefault(), StringUtils.format( Messages.MultiPageHTMLEditor_INF_LoadingPreview, name)); String outlineClass = element .getAttribute(UnifiedEditorsPlugin.OUTLINE_ATTR); try { Object obj = element .createExecutableExtension(UnifiedEditorsPlugin.CLASS_ATTR); if (obj instanceof ContributedBrowser) { ContributedBrowser browser = (ContributedBrowser) obj; if (CoreUIUtils.onMacOSX && j == 0 && browser.getBrowserType().indexOf("Firefox") != -1) //$NON-NLS-1$ { showFirefoxSafariConflictMessage(); IdeLog .logInfo( HTMLPlugin.getDefault(), StringUtils .format( Messages.MultiPageHTMLEditor_INF_SkippingTab, name)); } else { DefaultPreviewConfigurationPage page = new DefaultPreviewConfigurationPage( this); page.setTitle(name); page.createControl(getContainer()); page.setBrowser(browser, name); page.showBrowserArea(); int index = addPage(page.getControl()); previews.put(Integer.toString(index), page); page.setIndex(index); setPageText(index, " " + page.getTitle() + " "); //$NON-NLS-1$ //$NON-NLS-2$ IdeLog .logInfo( HTMLPlugin.getDefault(), StringUtils .format( Messages.MultiPageHTMLEditor_INF_LoadedPreview, name)); if (outlineClass != null) { Object ol = element .createExecutableExtension(UnifiedEditorsPlugin.OUTLINE_ATTR); if (ol instanceof ContributedOutline) { ContributedOutline outline = (ContributedOutline) ol; browser.setOutline(outline); outline.setBrowser(browser); editor.getOutlinePage().addOutline(outline, name); } } } } } catch (Exception e) { IdeLog .logError( HTMLPlugin.getDefault(), StringUtils .format( Messages.MultiPageHTMLEditor_UnableToCreateBrowserControl, name), e); } catch (Error e) { IdeLog .logError( HTMLPlugin.getDefault(), StringUtils .format( Messages.MultiPageHTMLEditor_UnableToCreateBrowserControl, name), e); } } for (IBrowserTabAdder adder : PreviewTabManager.getManager() .getTabAdders()) { try { IPreviewConfigurationPage[] pages = adder.getAddOnTabs(this, getContainer()); if (pages != null) { for (IPreviewConfigurationPage page : pages) { IdeLog .logInfo( HTMLPlugin.getDefault(), StringUtils .format( Messages.MultiPageHTMLEditor_INF_LoadingFromExt, page.getTitle())); addPreviewTab(page); } } } catch (Exception e) { IdeLog.logError(HTMLPlugin.getDefault(), Messages.MultiPageHTMLEditor_ERR_CreateTab, e); } catch (Error e) { IdeLog.logError(HTMLPlugin.getDefault(), Messages.MultiPageHTMLEditor_ERR_CreateTab, e); } } for (ContributedPreviewPage page : PreviewTabManager.getManager() .getStaticTabs()) { IdeLog.logInfo(HTMLPlugin.getDefault(), StringUtils.format( Messages.MultiPageHTMLEditor_INF_LoadingStaticContent, page .getTitle())); page.setEditor(this); page.createControl(getContainer()); page.showBrowserArea(); int index = addPage(page.getControl()); previews.put(Integer.toString(index), page); page.setIndex(index); Composite container = getContainer(); if (container instanceof CTabFolder) { if (page.getTabImage() != null) { ((CTabFolder) container).getItem(index).setImage( page.getTabImage()); } else { ((CTabFolder) container).getItem(index).setImage( HTMLPlugin.getImage("icons/add_tab_decorator.png")); //$NON-NLS-1$ } } setPageText(index, " " + page.getTitle() + " "); //$NON-NLS-1$ //$NON-NLS-2$ IdeLog.logInfo(HTMLPlugin.getDefault(), StringUtils.format( Messages.MultiPageHTMLEditor_INF_LoadedStaticContent, page .getTitle())); } if (file != null) { // Add add-on browsers created at the file level try { String addOnBrowsers = file .getPersistentProperty(new QualifiedName( "", //$NON-NLS-1$ HTMLPreviewPropertyPage.HTML_PREVIEW_ADDON_BROWSERS)); String addOnURLs = file .getPersistentProperty(new QualifiedName("", //$NON-NLS-1$ HTMLPreviewPropertyPage.HTML_PREVIEW_ADDON_URLS)); String addOnNames = file .getPersistentProperty(new QualifiedName( "", //$NON-NLS-1$ HTMLPreviewPropertyPage.HTML_PREVIEW_ADDON_NAMES)); String addOnTypes = file .getPersistentProperty(new QualifiedName("", //$NON-NLS-1$ HTMLPreviewPropertyPage.HTML_PREVIEW_ADDON_TYPE)); String addOnServers = file .getPersistentProperty(new QualifiedName( "", //$NON-NLS-1$ HTMLPreviewPropertyPage.HTML_PREVIEW_ADDON_SERVER_ID)); String addOnConfigs = file .getPersistentProperty(new QualifiedName( "", //$NON-NLS-1$ HTMLPreviewPropertyPage.HTML_PREVIEW_ADDON_CONFIG_ID)); if (addOnBrowsers != null && addOnURLs != null && addOnNames != null && addOnTypes != null && addOnServers != null && addOnConfigs != null) { String[] browsers = addOnBrowsers .split(HTMLPreviewPropertyPage.PREFERENCE_DELIMITER); String[] names = addOnNames .split(HTMLPreviewPropertyPage.PREFERENCE_DELIMITER); String[] types = addOnTypes .split(HTMLPreviewPropertyPage.PREFERENCE_DELIMITER); String[] servers = addOnServers .split(HTMLPreviewPropertyPage.PREFERENCE_DELIMITER); String[] configs = addOnConfigs .split(HTMLPreviewPropertyPage.PREFERENCE_DELIMITER); String[] urls = addOnURLs .split(HTMLPreviewPropertyPage.PREFERENCE_DELIMITER); if (browsers.length == names.length && browsers.length == urls.length && browsers.length == servers.length && browsers.length == configs.length && browsers.length == types.length) { browserList = BrowserExtensionLoader .getBrowsers(browsers); for (int i = 0; i < browsers.length; i++) { String name = names[i]; String browser = browsers[i]; String type = types[i]; String value = null; if (HTMLPreviewPropertyPage.CONFIG_BASED_TYPE .equals(type)) { value = configs[i]; } else if (HTMLPreviewPropertyPage.SERVER_BASED_TYPE .equals(type) || HTMLPreviewPropertyPage.APPENDED_SERVER_BASED_TYPE .equals(type)) { value = servers[i]; } else if (HTMLPreviewPropertyPage.ABSOLUTE_BASED_TYPE .equals(type) || HTMLPreviewPropertyPage.APPENDED_ABSOLUTE_BASED_TYPE .equals(type)) { value = urls[i]; } IConfigurationElement element = null; for (int j = 0; j < browserList.size(); j++) { IConfigurationElement curr = (IConfigurationElement) browserList .get(j); String browserName = BrowserExtensionLoader .getBrowserLabel(curr); if (browser != null && browser.equals(browserName)) { element = curr; break; } } if (element != null) { try { Object obj = element .createExecutableExtension(UnifiedEditorsPlugin.CLASS_ATTR); if (obj instanceof ContributedBrowser) { ContributedBrowser cb = (ContributedBrowser) obj; if (getPageCount() == 1 && CoreUIUtils.onMacOSX && i == 0 && cb.getBrowserType().indexOf( "Firefox") != -1) //$NON-NLS-1$ { showFirefoxSafariConflictMessage(); } else { PreviewConfigurationPage page = new PreviewConfigurationPage( this); IdeLog .logInfo( HTMLPlugin .getDefault(), StringUtils .format( Messages.MultiPageHTMLEditor_INF_LoadingFile, page .getTitle())); page.setType(type); page.setValue(value); page.setTitle(name); page.createControl(getContainer()); page.setBrowser(cb, browser); page.showBrowserArea(); int index = addPage(page .getControl()); Composite container = getContainer(); if (container instanceof CTabFolder) { ((CTabFolder) container) .getItem(index) .setImage( HTMLPlugin .getImage("icons/add_tab_decorator.png")); //$NON-NLS-1$ } previews.put(Integer .toString(index), page); page.setIndex(index); setPageText(index, page.getTitle() + " "); //$NON-NLS-1$ IdeLog .logInfo( HTMLPlugin .getDefault(), StringUtils .format( Messages.MultiPageHTMLEditor_INF_LoadedFile, page .getTitle())); } } } catch (Exception e) { IdeLog .logError( HTMLPlugin.getDefault(), StringUtils .format( Messages.MultiPageHTMLEditor_UnableToCreateBrowserControl, name), e); } catch (Error e) { IdeLog .logError( HTMLPlugin.getDefault(), StringUtils .format( Messages.MultiPageHTMLEditor_UnableToCreateBrowserControl, name), e); } } } } } } catch (CoreException e) { IdeLog.logError(HTMLPlugin.getDefault(), Messages.MultiPageHTMLEditor_ERR_CreateFileTab, e); } } } /** * Adds a preview tab to the editor * * @param page */ public void addPreviewTab(IPreviewConfigurationPage page) { if (page != null) { int index = addPage(page.getControl()); previews.put(Integer.toString(index), page); page.setIndex(index); Composite container = getContainer(); if (container instanceof CTabFolder) { if (page.getTabImage() != null) { ((CTabFolder) container).getItem(index).setImage( page.getTabImage()); } else { ((CTabFolder) container).getItem(index).setImage( HTMLPlugin.getImage("icons/add_tab_decorator.png")); //$NON-NLS-1$ } } setPageText(index, " " + page.getTitle() + " "); //$NON-NLS-1$ //$NON-NLS-2$ } } /** * @see org.eclipse.ui.part.MultiPageEditorPart#getContainer() */ public Composite getContainer() { return super.getContainer(); } /** * Gets the preview pages for the editor * * @return - current editor preview pages */ public IPreviewConfigurationPage[] getPreviewPages() { return this.previews.values().toArray(new IPreviewConfigurationPage[0]); } /** * Saves the preview pages */ public void savePreviewsPages() { IEditorInput input = getEditorInput(); if (input instanceof IFileEditorInput) { Iterator<IPreviewConfigurationPage> iter = previews.values() .iterator(); List<PreviewConfigurationPage> previews = new ArrayList<PreviewConfigurationPage>(); List<PreviewConfigurationPage> addPreviews = new ArrayList<PreviewConfigurationPage>(); while (iter.hasNext()) { IPreviewConfigurationPage page = iter.next(); if (page instanceof PreviewConfigurationPage) { if (CoreUIUtils.onMacOSX && isFirefoxBrowser(page)) { addPreviews.add((PreviewConfigurationPage) page); IdeLog .logInfo( HTMLPlugin.getDefault(), StringUtils .format( Messages.MultiPageHTMLEditor_INF_MovingTab, page.getTitle())); } else { previews.add((PreviewConfigurationPage) page); IdeLog .logInfo( HTMLPlugin.getDefault(), StringUtils .format( Messages.MultiPageHTMLEditor_INF_SavingTab, page.getTitle())); } } else { IdeLog.logInfo(HTMLPlugin.getDefault(), StringUtils.format( Messages.MultiPageHTMLEditor_INF_SkippingSave, page .getTitle())); } } previews.addAll(addPreviews); IFile file = ((IFileEditorInput) input).getFile(); StringBuffer names = new StringBuffer(""); //$NON-NLS-1$ StringBuffer browser = new StringBuffer(""); //$NON-NLS-1$ StringBuffer types = new StringBuffer(""); //$NON-NLS-1$ StringBuffer servers = new StringBuffer(""); //$NON-NLS-1$ StringBuffer configs = new StringBuffer(""); //$NON-NLS-1$ StringBuffer absolutes = new StringBuffer(""); //$NON-NLS-1$ for (PreviewConfigurationPage pcp : previews) { String type = pcp.getType(); String value = pcp.getValue(); if (HTMLPreviewPropertyPage.SERVER_BASED_TYPE.equals(type) || HTMLPreviewPropertyPage.APPENDED_SERVER_BASED_TYPE .equals(type)) { servers.append(value + HTMLPreviewPropertyPage.PREFERENCE_DELIMITER); configs.append(HTMLPreviewPropertyPage.INVALID + HTMLPreviewPropertyPage.PREFERENCE_DELIMITER); absolutes.append(HTMLPreviewPropertyPage.INVALID + HTMLPreviewPropertyPage.PREFERENCE_DELIMITER); } else if (HTMLPreviewPropertyPage.CONFIG_BASED_TYPE .equals(type)) { servers.append(HTMLPreviewPropertyPage.INVALID + HTMLPreviewPropertyPage.PREFERENCE_DELIMITER); configs.append(value + HTMLPreviewPropertyPage.PREFERENCE_DELIMITER); absolutes.append(HTMLPreviewPropertyPage.INVALID + HTMLPreviewPropertyPage.PREFERENCE_DELIMITER); } else if (HTMLPreviewPropertyPage.ABSOLUTE_BASED_TYPE .equals(type)) { servers.append(HTMLPreviewPropertyPage.INVALID + HTMLPreviewPropertyPage.PREFERENCE_DELIMITER); configs.append(HTMLPreviewPropertyPage.INVALID + HTMLPreviewPropertyPage.PREFERENCE_DELIMITER); absolutes.append(value + HTMLPreviewPropertyPage.PREFERENCE_DELIMITER); } else { servers.append(HTMLPreviewPropertyPage.INVALID + HTMLPreviewPropertyPage.PREFERENCE_DELIMITER); configs.append(HTMLPreviewPropertyPage.INVALID + HTMLPreviewPropertyPage.PREFERENCE_DELIMITER); absolutes.append(HTMLPreviewPropertyPage.INVALID + HTMLPreviewPropertyPage.PREFERENCE_DELIMITER); } types.append(type + HTMLPreviewPropertyPage.PREFERENCE_DELIMITER); names.append(pcp.getTitle() + HTMLPreviewPropertyPage.PREFERENCE_DELIMITER); browser.append(pcp.getBrowserLabel() + HTMLPreviewPropertyPage.PREFERENCE_DELIMITER); } try { file .setPersistentProperty( new QualifiedName( "", HTMLPreviewPropertyPage.HTML_PREVIEW_ADDON_BROWSERS), //$NON-NLS-1$ browser.toString()); file.setPersistentProperty(new QualifiedName( "", HTMLPreviewPropertyPage.HTML_PREVIEW_ADDON_NAMES), //$NON-NLS-1$ names.toString()); file.setPersistentProperty(new QualifiedName( "", HTMLPreviewPropertyPage.HTML_PREVIEW_ADDON_TYPE), //$NON-NLS-1$ types.toString()); file.setPersistentProperty(new QualifiedName( "", HTMLPreviewPropertyPage.HTML_PREVIEW_ADDON_URLS), //$NON-NLS-1$ absolutes.toString()); file .setPersistentProperty( new QualifiedName( "", HTMLPreviewPropertyPage.HTML_PREVIEW_ADDON_CONFIG_ID), //$NON-NLS-1$ configs.toString()); file .setPersistentProperty( new QualifiedName( "", HTMLPreviewPropertyPage.HTML_PREVIEW_ADDON_SERVER_ID), //$NON-NLS-1$ servers.toString()); } catch (CoreException e) { IdeLog.logInfo(HTMLPlugin.getDefault(), "Error saving preview page add-ons", e); //$NON-NLS-1$ } } } /** * Is this browser a firefox-based browser? * * @param page * @return */ private boolean isFirefoxBrowser(IPreviewConfigurationPage page) { String type = page.getBrowserLabel(); String classType = page.getBrowserType(); if ("Firefox".equals(type) || (classType != null && classType.indexOf("Firefox") != -1)) //$NON-NLS-1$ //$NON-NLS-2$ { return true; } else { return false; } } /** * @param index * @param title */ public void setPreviewPageText(int index, String title) { setPageText(index, title); } /** * @see org.eclipse.ui.IWorkbenchPart#dispose() */ public void dispose() { if (isDisposing) { return; } isDisposing = true; // We are not guaranteed to get the same temp file // everytime because of addition of random number // to fix STU-2094 // // if (isFileEditorInput()) // { // File tmpFile = editor.getTempFile(); // if (tmpFile.exists()) // { // tmpFile.delete(); // } // } if (wrapper != null) { wrapper.dispose(); } if (_siteEditor != null) { _siteEditor.dispose(); } if (editor != null) { if (editor.getDocumentProvider() != null) { editor.getDocumentProvider().removeElementStateListener( elementListener); } editor.removePropertyListener(propertyListener); editor.dispose(); } if (previews != null && previews.size() != 0) { disposePreviews(); previews = null; } // if(_page0 != null) // _page0.dispose(); _page0 = null; editor = null; wrapper = null; _siteEditor = null; super.dispose(); } /** * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor) */ public void doSave(IProgressMonitor monitor) { IEditorPart editor = getEditor(0); editor.doSave(monitor); setInput(editor.getEditorInput()); setPartName(getEditorInput().getName()); } /** * @see org.eclipse.ui.ISaveablePart#doSaveAs() */ public void doSaveAs() { IEditorPart editor = getEditor(0); editor.doSaveAs(); setInput(editor.getEditorInput()); setPartName(getEditorInput().getName()); } /** * gotoMarker * * @param marker */ public void gotoMarker(IMarker marker) { setActivePage(0); IDE.gotoMarker(getEditor(0), marker); } /** * @see org.eclipse.ui.IEditorPart#init(org.eclipse.ui.IEditorSite, * org.eclipse.ui.IEditorInput)ccccc */ public void init(IEditorSite site, IEditorInput editorInput) throws PartInitException { super.init(site, editorInput); ICommandService commandService = (ICommandService) site.getService(ICommandService.class); final Command nextMultipageEditorTabCommand = commandService.getCommand("com.aptana.ide.editors.nextMultipageEditorTab"); //$NON-NLS-1$ final Command previousMultipageEditorTabCommand = commandService.getCommand("com.aptana.ide.editors.previousMultipageEditorTab"); //$NON-NLS-1$ IHandlerService handlerService = (IHandlerService) site.getService(IHandlerService.class); handlerService.activateHandler(nextMultipageEditorTabCommand.getId(), new AbstractHandler() { public Object execute(ExecutionEvent event) throws ExecutionException { gotoNextMultipageEditorTab(); return null; } }); handlerService.activateHandler(previousMultipageEditorTabCommand.getId(), new AbstractHandler() { public Object execute(ExecutionEvent event) throws ExecutionException { gotoPreviousMultipageEditorTab(); return null; } }); } private void gotoNextMultipageEditorTab() { Composite comp = getContainer(); if (comp instanceof CTabFolder) { CTabFolder tabFolder = (CTabFolder) comp; int itemCount = tabFolder.getItemCount(); if (itemCount > 1) { int selectionIndex = tabFolder.getSelectionIndex(); selectionIndex++; if (selectionIndex >= itemCount) { selectionIndex = 0; } setActivePage(selectionIndex); } } } private void gotoPreviousMultipageEditorTab() { Composite comp = getContainer(); if (comp instanceof CTabFolder) { CTabFolder tabFolder = (CTabFolder) comp; int itemCount = tabFolder.getItemCount(); if (itemCount > 1) { int selectionIndex = tabFolder.getSelectionIndex(); selectionIndex--; if (selectionIndex < 0) { selectionIndex = itemCount -1; } setActivePage(selectionIndex); } } } /** * @see com.aptana.ide.editor.html.IHTMLEditorPart#isFileEditorInput() */ public boolean isFileEditorInput() { return editor.isFileEditorInput(); } /** * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed() */ public boolean isSaveAsAllowed() { return true; } /** * @see org.eclipse.ui.part.MultiPageEditorPart#pageChange(int) */ protected void pageChange(int newPageIndex) { super.pageChange(newPageIndex); if (newPageIndex == 0) { wrapper.getSite().setSelectionProvider( editor.getSelectionProvider()); wrapper.updateSource(); wrapper.setToolbarVisible(true); Iterator<IPreviewConfigurationPage> pages = previews.values() .iterator(); while (pages.hasNext()) { pages.next().clearBrowser(); } } else { getSite() .setSelectionProvider(new MultiPageSelectionProvider(this)); wrapper.updatePreview(); wrapper.setToolbarVisible(false); } } /** * Change to the source editor, and move caret to the specified offset. * * @param offset */ public void setOffset(int offset) { setActivePage(0); editor.selectAndReveal(offset, 0); } /** * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class) */ public Object getAdapter(Class adapter) { // Context is just plugin ID + name of class. Matches contexts.xml file if (editor != null) { return editor.getAdapter(adapter); } else { IdeLog.logError(HTMLPlugin.getDefault(), StringUtils.format( Messages.MultiPageHTMLEditor_EditorIsNull, adapter .toString())); return null; } } /** * @see org.eclipse.ui.part.WorkbenchPart#firePropertyChange(int) */ protected void firePropertyChange(int propertyId) { super.firePropertyChange(propertyId); wrapper.firePropertyChange2(propertyId); } /** IEditorSite for the source editor. */ private static class SourceEditorSite extends MultiPageEditorSite { private HTMLSourceEditor _editor = null; private IEditorSite _site; private ArrayList _menuExtenders; private boolean isDisposing = false; /** * SourceEditorSite * * @param multiPageEditor * @param editor * @param site */ public SourceEditorSite(MultiPageEditorPart multiPageEditor, IEditorPart editor, IEditorSite site) { super(multiPageEditor, editor); this._site = site; this._editor = (HTMLSourceEditor) editor; } /** * @see org.eclipse.ui.part.MultiPageEditorSite#getId() */ public String getId() { return _site.getId(); } /** * @see org.eclipse.ui.IEditorSite#getActionBarContributor() */ public IEditorActionBarContributor getActionBarContributor() { return _site.getActionBarContributor(); } /** * @see org.eclipse.ui.IWorkbenchPartSite#registerContextMenu(java.lang.String, * org.eclipse.jface.action.MenuManager, * org.eclipse.jface.viewers.ISelectionProvider) */ public void registerContextMenu(String menuId, MenuManager menuManager, ISelectionProvider selectionProvider) { if (_editor != null) { if (_menuExtenders == null) { _menuExtenders = new ArrayList(1); } _menuExtenders.add(new PopupMenuExtender(menuId, menuManager, selectionProvider, _editor)); } } /** * @see org.eclipse.ui.part.MultiPageEditorSite#dispose() */ public void dispose() { if (isDisposing) { return; } isDisposing = true; super.dispose(); if (_menuExtenders != null) { for (int i = 0; i < _menuExtenders.size(); i++) { ((PopupMenuExtender) _menuExtenders.get(i)).dispose(); } _menuExtenders = null; } _editor = null; if (_site != null && _site instanceof EditorSite) { ((EditorSite) _site).dispose(); } _site = null; } /** * @see org.eclipse.ui.IWorkbenchPartSite#getKeyBindingService() */ public IKeyBindingService getKeyBindingService() { return _site.getKeyBindingService(); } /** * @see org.eclipse.ui.IWorkbenchPartSite#getPluginId() */ public String getPluginId() { return _site.getPluginId(); } /** * @see org.eclipse.ui.IWorkbenchPartSite#getRegisteredName() */ public String getRegisteredName() { return _site.getRegisteredName(); } /** * @see org.eclipse.ui.IWorkbenchPartSite#registerContextMenu(org.eclipse.jface.action.MenuManager, * org.eclipse.jface.viewers.ISelectionProvider) */ public void registerContextMenu(MenuManager menuManager, ISelectionProvider selProvider) { _site.registerContextMenu(menuManager, selProvider); } } /** * @see com.aptana.ide.editor.html.IHTMLEditorPart#setBrowserURL(java.lang.String) */ public void setBrowserURL(String url) { String index = Integer.toString(this.getActivePage()); if ((previews.containsKey(index))) { if (!HTMLPlugin.getDefault().getPreferenceStore().getBoolean( IPreferenceConstants.AUTO_SAVE_PROMPTED)) { HTMLPlugin.getDefault().getPreferenceStore().setValue( IPreferenceConstants.AUTO_SAVE_PROMPTED, true); boolean autoSave = MessageDialog.openQuestion(this .getContainer().getShell(), Messages.MultiPageHTMLEditor_AutoSaveTitlte, Messages.MultiPageHTMLEditor_AutoSaveMessage); HTMLPlugin.getDefault().getPreferenceStore().setValue( IPreferenceConstants.AUTO_SAVE_BEFORE_PREVIEWING, autoSave); } if (editor.isDirty()) { boolean autoSave = HTMLPlugin .getDefault() .getPreferenceStore() .getBoolean( IPreferenceConstants.AUTO_SAVE_BEFORE_PREVIEWING); if (autoSave) { editor.doSave(new NullProgressMonitor()); } } IPreviewConfigurationPage page = (IPreviewConfigurationPage) previews .get(index); if (page instanceof DefaultPreviewConfigurationPage) { setTabIcon(page, null); } else if (page.getTabImage() != null) { setTabIcon(page, page.getTabImage()); } else { setTabIcon(page, HTMLPlugin .getImage("icons/add_tab_decorator.png")); //$NON-NLS-1$ } page.setURL(url); Iterator<IPreviewConfigurationPage> pages = previews.values() .iterator(); while (pages.hasNext()) { IPreviewConfigurationPage curr = pages.next(); if (curr != page) { curr.clearBrowser(); } } } this.url = url; } /** * Sets the tab icon * * @param page * @param icon */ public void setTabIcon(IPreviewConfigurationPage page, Image icon) { Iterator<String> keys = previews.keySet().iterator(); while (keys.hasNext()) { String key = keys.next(); if (page != null && page == previews.get(key)) { int index = Integer.parseInt(key.toString()); if (getContainer() instanceof CTabFolder) { CTabFolder tabs = (CTabFolder) getContainer(); if (index < tabs.getItemCount()) { tabs.getItem(index).setImage(icon); } } break; } } } /** * Sets the tab tooltip text for a page * * @param page * @param text */ public void setTabTooltip(IPreviewConfigurationPage page, String text) { Iterator<String> keys = previews.keySet().iterator(); while (keys.hasNext()) { String key = keys.next(); if (page != null && page == previews.get(key)) { int index = Integer.parseInt(key.toString()); if (getContainer() instanceof CTabFolder) { CTabFolder tabs = (CTabFolder) getContainer(); if (index < tabs.getItemCount()) { tabs.getItem(index).setToolTipText(text); } } break; } } } /** * Gets the url of this editor * * @return - url */ public String getURL() { return this.url; } private void disposePreviews() { Object[] _previews = previews.values().toArray(); for (int i = 0; i < _previews.length; i++) { ((IPreviewConfigurationPage) _previews[i]).dispose(); } } /** * Sets the currently active page. * * @param pageIndex * the index of the page to be activated; the index must be valid */ public void setActivePage(int pageIndex) { super.setActivePage(pageIndex); } /** * Returns the number of pages in this multi-page editor. * * @return the number of pages */ public int getPageCount() { return super.getPageCount(); } /** * Returns the index of the preview page with the specified name, or -1 if * not found * * @param pageName * @return index */ public int findPageIndex(String pageName) { Set<String> s = previews.keySet(); for (String object : s) { IPreviewConfigurationPage page = (IPreviewConfigurationPage) previews .get(object); if (page.getTitle().equals(pageName)) { return Integer.parseInt(object); } } return -1; } }