/******************************************************************************* * Copyright (c) 2011, 2016 Wind River Systems, Inc. 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: * Wind River Systems - initial API and implementation *******************************************************************************/ package org.eclipse.tcf.te.ui.views.editor.pages; import org.eclipse.core.runtime.Assert; import org.eclipse.help.HelpSystem; import org.eclipse.help.IContext; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ContributionManager; import org.eclipse.jface.action.ControlContribution; import org.eclipse.jface.action.GroupMarker; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.viewers.ILabelDecorator; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; import org.eclipse.tcf.te.ui.forms.CustomFormToolkit; import org.eclipse.tcf.te.ui.forms.FormLayoutFactory; import org.eclipse.tcf.te.ui.views.activator.UIPlugin; import org.eclipse.tcf.te.ui.views.editor.Editor; import org.eclipse.tcf.te.ui.views.extensions.LabelProviderDelegateExtensionPointManager; import org.eclipse.tcf.te.ui.views.interfaces.ImageConsts; import org.eclipse.tcf.te.ui.views.nls.Messages; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.menus.IMenuService; /** * Abstract details editor page implementation managing * an custom form toolkit instance. */ public abstract class AbstractCustomFormToolkitEditorPage extends AbstractEditorPage { // Reference to the form toolkit instance private CustomFormToolkit toolkit = null; // Reference to the toolbar toolBarManager to release menu contributions for private IToolBarManager toolBarManager = null; // Reference to the toolbar MenuManager to release menu contributions for // private IMenuManager menuManager = null; // The default help action class definition static protected class HelpAction extends Action { /* default */ final String helpID; /** * Constructor. * * @param helpID The context help id. Must not be <code>null</code>. */ public HelpAction(String helpID) { super(Messages.AbstractCustomFormToolkitEditorPage_HelpAction_label, IAction.AS_PUSH_BUTTON); Assert.isNotNull(helpID); this.helpID = helpID; setToolTipText(Messages.AbstractCustomFormToolkitEditorPage_HelpAction_tooltip); setImageDescriptor(UIPlugin.getImageDescriptor(ImageConsts.HELP)); } /* (non-Javadoc) * @see org.eclipse.jface.action.Action#run() */ @Override public void run() { PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { @Override public void run() { IContext context = HelpSystem.getContext(helpID); if (context != null) { PlatformUI.getWorkbench().getHelpSystem().displayHelp(context); } else { PlatformUI.getWorkbench().getHelpSystem().displayHelp(); } } }); } } /** * Returns the custom form toolkit instance. * * @return The custom form toolkit instance or <code>null</code>. */ protected final CustomFormToolkit getFormToolkit() { return toolkit; } /** * Sets the custom form toolkit instance. * * @param toolkit The custom form toolkit instance or <code>null</code>. */ protected final void setFormToolkit(CustomFormToolkit toolkit) { this.toolkit = toolkit; } /* (non-Javadoc) * @see org.eclipse.ui.forms.editor.FormPage#dispose() */ @Override public void dispose() { IMenuService service = (IMenuService) getSite().getService(IMenuService.class); // Get the menu service and release the toolbar toolBarManager if (service != null) { if (toolBarManager instanceof ContributionManager) { service.releaseContributions((ContributionManager)toolBarManager); } // if (menuManager instanceof ContributionManager) { // service.releaseContributions((ContributionManager)menuManager); // } } // Dispose the custom form toolkit if (toolkit != null) { toolkit.dispose(); toolkit = null; } // Dispose all the rest super.dispose(); } /* (non-Javadoc) * @see org.eclipse.ui.forms.editor.FormPage#createFormContent(org.eclipse.ui.forms.IManagedForm) */ @Override protected void createFormContent(IManagedForm managedForm) { super.createFormContent(managedForm); Assert.isNotNull(managedForm); // Create the toolkit instance toolkit = new CustomFormToolkit(managedForm.getToolkit()); // Configure the managed form configureManagedForm(managedForm); // Do create the content of the form now doCreateFormContent(managedForm.getForm().getBody(), getFormToolkit()); // Re-arrange the controls managedForm.reflow(true); } /** * Configure the managed form to be ready for usage. * * @param managedForm The managed form. Must not be <code>null</code>. */ protected void configureManagedForm(IManagedForm managedForm) { Assert.isNotNull(managedForm); // Configure main layout Composite body = managedForm.getForm().getBody(); body.setLayout(FormLayoutFactory.createFormGridLayout(false, 1)); // Set context help id if (getContextHelpId() != null) { PlatformUI.getWorkbench().getHelpSystem().setHelp(managedForm.getForm(), getContextHelpId()); } // Decorate the form header getFormToolkit().getFormToolkit().decorateFormHeading(managedForm.getForm().getForm()); // Set the header text String title = getFormTitle(); if (title != null) setFormTitle(title); // Set the header image managedForm.getForm().getForm().setImage(getFormImage()); // Add the toolbar items which will appear in the form header toolBarManager = managedForm.getForm().getForm().getToolBarManager(); // Add the default "additions" separator toolBarManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); // Create fixed toolbar contribution items createToolbarContributionItems(toolBarManager); // Get the menu service and populate contributed toolbar actions IMenuService service = (IMenuService) getSite().getService(IMenuService.class); if (service != null && toolBarManager instanceof ContributionManager) { service.populateContributionManager((ContributionManager)toolBarManager, "toolbar:" + getId()); //$NON-NLS-1$ } // // Add the menu items which will appear in the form header // menuManager = managedForm.getForm().getForm().getMenuManager(); // // Get the menu service and populate contributed menu actions // if (service != null && menuManager instanceof ContributionManager) { // service.populateContributionManager((ContributionManager)menuManager, "menu:" + getId()); //$NON-NLS-1$ // } // // Trigger an update of the menu widget // menuManager.update(true); // Trigger an update of the toolbar widget toolBarManager.update(true); } /** * Returns the context help id to associate with the page form. * * @return The context help id. */ protected String getContextHelpId() { return null; } /** * Returns the form title to set to the top form header. * * @return The form title or <code>null</code>. */ protected String getFormTitle() { return null; } /** * Returns the form title state decoration. * * @return The form title state decoration or <code>null</code>. */ public String getFormTitleStateDecoration() { return null; } /** * Returns the image to be set to the top form header. * * @return The image or <code>null</code> to use no image. */ protected Image getFormImage() { Image image = null; ILabelProvider[] delegates = LabelProviderDelegateExtensionPointManager.getInstance().getDelegates(getEditorInputNode(), false); if (delegates != null && delegates.length > 0) { image = delegates[0].getImage(getEditorInputNode()); if (image != null && delegates[0] instanceof ILabelDecorator) { image = ((ILabelDecorator)delegates[0]).decorateImage(image, getEditorInputNode()); } } return image; } /** * Update the form header title. * * @param title The title text. Must not be <code>null</code>: */ public void setFormTitle(String title) { Assert.isNotNull(title); String fullTitle = title; String titleStateDecoration = getFormTitleStateDecoration(); if (titleStateDecoration != null) fullTitle += " " + titleStateDecoration; //$NON-NLS-1$ String oldTitle = getManagedForm().getForm().getText(); if (!fullTitle.equals(oldTitle)) { getManagedForm().getForm().setText(fullTitle); } } /** * Update the form header image. * * @param image The image or <code>null</code>. */ public void setFormImage(Image image) { ScrolledForm form = getManagedForm().getForm(); if (form.getImage() != image) form.setImage(image); if (getEditor() instanceof Editor) { Editor editor = (Editor)getEditor(); if (editor.getTitleImage() != image) editor.setTitleImage(image); } } /* (non-Javadoc) * @see org.eclipse.tcf.te.ui.views.editor.pages.AbstractEditorPage#setActive(boolean) */ // @Override // public void setActive(boolean active) { // if (active) setFormTitle(getFormTitle()); // super.setActive(active); // } /** * Create the toolbar contribution items. * * @param toolBarManager The toolbar toolBarManager. Must not be <code>null</code>. */ protected void createToolbarContributionItems(IToolBarManager manager) { Assert.isNotNull(manager); manager.add(new Separator("group.connect")); //$NON-NLS-1$ manager.add(new Separator("group.launch")); //$NON-NLS-1$ manager.add(new GroupMarker("group.launch.rundebug")); //$NON-NLS-1$ manager.add(new GroupMarker("group.launch.additions")); //$NON-NLS-1$ manager.add(new Separator("group.additions")); //$NON-NLS-1$ manager.add(new Separator("group.additions.control")); //$NON-NLS-1$ manager.add(new Separator("group.help")); //$NON-NLS-1$ IContributionItem linkContribution = doCreateLinkContribution(manager); if (linkContribution != null) manager.add(linkContribution); // If the page is associated with a context help id, add a default // help action button into the toolbar if (getContextHelpId() != null) { Action helpAction = doCreateHelpAction(getContextHelpId()); if (helpAction != null) manager.add(helpAction); } final MenuManager mgr = new MenuManager(); mgr.add(new Separator("group.launch")); //$NON-NLS-1$ mgr.add(new GroupMarker("group.launch.rundebug")); //$NON-NLS-1$ mgr.add(new Separator("group.launch.additions")); //$NON-NLS-1$ mgr.add(new Separator("group.delete")); //$NON-NLS-1$ mgr.add(new Separator("group.additions")); //$NON-NLS-1$ final IMenuService service = (IMenuService) getSite().getService(IMenuService.class); if (service != null) { service.populateContributionManager(mgr, "menu:" + AbstractCustomFormToolkitEditorPage.this.getId()); //$NON-NLS-1$ } if (mgr.getSize() > 5) { toolBarManager.add(new ControlContribution("toolbarmenu") { //$NON-NLS-1$ @Override protected Control createControl(Composite parent) { final ToolBar tb = new ToolBar(parent, SWT.FLAT); final ToolItem item = new ToolItem(tb, SWT.PUSH); item.setImage(UIPlugin.getImage(ImageConsts.MENU)); item.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { MenuManager mgr = new MenuManager(); mgr.add(new Separator("group.launch")); //$NON-NLS-1$ mgr.add(new GroupMarker("group.launch.rundebug")); //$NON-NLS-1$ mgr.add(new Separator("group.launch.additions")); //$NON-NLS-1$ mgr.add(new Separator("group.delete")); //$NON-NLS-1$ mgr.add(new Separator("group.additions")); //$NON-NLS-1$ service.populateContributionManager(mgr, "menu:" + AbstractCustomFormToolkitEditorPage.this.getId()); //$NON-NLS-1$ Menu menu = mgr.createContextMenu(tb); menu.setVisible(true); } }); return tb; } }); } } /** * Create the help action. * * @param contextHelpId The context help id. Must not be <code>null</code>. * @return The help action or <code>null</code>. */ protected Action doCreateHelpAction(String contextHelpId) { Assert.isNotNull(contextHelpId); return new HelpAction(contextHelpId); } protected IContributionItem doCreateLinkContribution(IToolBarManager tbManager) { return null; } /** * Do create the managed form content. * * @param parent The parent composite. Must not be <code>null</code> * @param toolkit The {@link CustomFormToolkit} instance. Must not be <code>null</code>. */ protected abstract void doCreateFormContent(Composite parent, CustomFormToolkit toolkit); }