/******************************************************************************* * Copyright (c) 2012 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.config.ui.editors; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.viewers.ColumnViewer; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.ui.forms.SectionPart; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Section; /** * This class implements the master portion of the master/details UI pattern. * Classes that extend {@code AbstractConfigMasterPart} will display a * structured overview of some portion of a Spring configuration file. This * class is a base only, and clients should consider extending * {@link AbstractNamespaceMasterPart} instead. * @author Leo Dos Santos * @author Christian Dupuis * @since 2.0.0 */ public abstract class AbstractConfigMasterPart extends SectionPart { private final AbstractConfigFormPage page; /** * The toolkit used by the form part. */ protected FormToolkit toolkit; private ToolBarManager toolBarManager; private ColumnViewer viewer; private SpringConfigContentProvider contentProv; private AbstractConfigLabelProvider labelProv; /** * Constructs a master part with a reference to its container page and its * parent composite. * * @param page the hosting form page * @param parent the parent composite */ public AbstractConfigMasterPart(AbstractConfigFormPage page, Composite parent) { super(parent, page.getManagedForm().getToolkit(), Section.TITLE_BAR | Section.DESCRIPTION); this.page = page; this.toolkit = page.getManagedForm().getToolkit(); } protected abstract void createButtons(Composite client); /** * Creates the content of the master part inside the form part. This method * is called when the master/details block is created. */ protected void createContents() { GridData data = new GridData(GridData.FILL_BOTH); data.minimumWidth = 250; data.grabExcessVerticalSpace = true; Section section = getSection(); section.setLayout(new GridLayout()); section.setLayoutData(data); section.setText(getSectionTitle()); section.setDescription(getSectionDescription()); Composite client = toolkit.createComposite(section); client.setLayout(new GridLayout(2, false)); client.setLayoutData(new GridData(GridData.FILL_BOTH)); section.setClient(client); toolBarManager = new ToolBarManager(SWT.FLAT); ToolBar toolbar = toolBarManager.createControl(section); final Cursor handCursor = new Cursor(Display.getCurrent(), SWT.CURSOR_HAND); toolbar.setCursor(handCursor); section.setTextClient(toolbar); toolbar.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { if (handCursor != null && !handCursor.isDisposed()) { handCursor.dispose(); } } }); data = new GridData(GridData.FILL_BOTH); data.heightHint = 50; data.widthHint = 50; contentProv = createViewerContentProvider(); labelProv = createViewerLabelProvider(); viewer = createViewer(client); viewer.setContentProvider(contentProv); viewer.setLabelProvider(labelProv); viewer.setInput(getConfigEditor().getDomDocument()); MenuManager menuMgr = new MenuManager(); IMenuListener listener = new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { fillContextMenu(manager); } }; menuMgr.addMenuListener(listener); menuMgr.setRemoveAllWhenShown(true); Control control = viewer.getControl(); Menu menu = menuMgr.createContextMenu(control); control.setMenu(menu); viewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { getManagedForm().fireSelectionChanged(AbstractConfigMasterPart.this, event.getSelection()); } }); viewer.getControl().setLayoutData(data); Composite buttonComp = toolkit.createComposite(client); buttonComp.setLayout(new GridLayout()); buttonComp.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING)); createButtons(buttonComp); postCreateContents(); toolBarManager.update(true); } /** * This method is called automatically when the master part is created. * Clients must create and return the desired column viewer here. * * @param client the parent composite * @return viewer of the master part */ protected abstract ColumnViewer createViewer(Composite client); /** * This method is called automatically when the master part is created. * Clients must create and return a content provider for their viewer here. * * @return content provider for the master viewer */ protected abstract SpringConfigContentProvider createViewerContentProvider(); /** * This method is called automatically when the master part is created. * Clients must create and return a label provider for their viewer here. * * @return label provider for the master viewer */ protected abstract AbstractConfigLabelProvider createViewerLabelProvider(); /** * This method is called automatically when an element in the master viewer * is right-clicked upon. Clients may override to create and add menu items * to the menu manager that are appropriate to the selection. * * @param manager the menu manager on the master viewer */ protected abstract void fillContextMenu(IMenuManager manager); /** * Returns the the parent editor as an {@link AbstractConfigEditor} object. * * @return parent editor instance */ public AbstractConfigEditor getConfigEditor() { return page.getEditor(); } /** * Returns the form page hosting this part. * * @return page the hosting form page */ public AbstractConfigFormPage getFormPage() { return page; } /** * This method is called automatically when the master part is created. * Clients must return the description of their master section part here. * * @return master part description */ protected abstract String getSectionDescription(); /** * This method is called automatically when the master part is created. * Clients must return the title of their master section part here. * * @return master part title */ protected abstract String getSectionTitle(); /** * Returns the toolbar manager for the section section header. * * @return section's toolbar manager */ protected ToolBarManager getToolBarManager() { return toolBarManager; } /** * Returns the viewer of the master part. * * @return viewer of the master part */ public ColumnViewer getViewer() { return viewer; } /** * Returns the content provider used by the master viewer. * * @return content provider for the master viewer */ protected SpringConfigContentProvider getViewerContentProvider() { return contentProv; } /** * This method is called automatically at the end of the * {@link #createContents()} method. Clients may override to perform * additional operations on the master viewer or add additional content to * the part. */ protected abstract void postCreateContents(); @Override public void refresh() { viewer.refresh(); getManagedForm().fireSelectionChanged(AbstractConfigMasterPart.this, viewer.getSelection()); super.refresh(); } }