| /******************************************************************************* |
| * Copyright (c) 2007 Oracle Corporation 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: |
| * Oracle Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jst.pagedesigner.properties.internal; |
| |
| import java.util.Collections; |
| import java.util.List; |
| |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jst.pagedesigner.properties.WPETabbedPropertySheetPage; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.graphics.Point; |
| import org.eclipse.swt.graphics.Rectangle; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Control; |
| import org.eclipse.swt.widgets.Layout; |
| import org.eclipse.ui.IWorkbenchPart; |
| import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection; |
| import org.eclipse.ui.views.properties.tabbed.ISection; |
| import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; |
| |
| /** |
| * Using the tag entity's QuickEditTabSections meta-data, this section reacts to changes in selection, |
| * and will dynamically create a QuickEditTabGroup. The QuickEditTabGroup is cached and reused. |
| * <br><br> |
| * This section delegates construction to the sections discovered thru meta data. |
| * Because this section is not disposed of until the tab is disposed, this section will enforce the expected section lifecycle |
| * on the sections loaded from meta data. This occurs during setInput. But will pass on all section lifecycle events as |
| * this section receives them. |
| * <br><br> |
| * The lifecycle that this section enforces on it's child sections in the setInput call on this section are (in order): |
| * <li>createControls |
| * <li>setInput |
| * <li>aboutToBeShown |
| * <li>refresh |
| * |
| * When tab section lifecycle events occur to this section, they are passed on to all child sections also. |
| * |
| */ |
| public class QuickEditTabSection extends AbstractPropertySection { |
| |
| private QuickEditTabManager manager; |
| private Composite _composite; |
| private Composite _qeGroupComposite; |
| private WPETabbedPropertySheetPage _tabbedPropertySheetPage; |
| |
| private QuickEditTabManager getTabManager() { |
| if (manager == null) { |
| manager = _tabbedPropertySheetPage.getTabManager(); |
| } |
| return manager; |
| } |
| |
| @Override |
| public void createControls(Composite parent, |
| TabbedPropertySheetPage tabbedPropertySheetPage) { |
| super.createControls(parent, tabbedPropertySheetPage); |
| _composite = parent; |
| _tabbedPropertySheetPage = (WPETabbedPropertySheetPage)tabbedPropertySheetPage; |
| } |
| |
| @Override |
| public void setInput(IWorkbenchPart part, ISelection selection) { |
| super.setInput(part, selection); |
| if (getTabManager() != null){ |
| aboutToBeHidden(); |
| createOrResetQuickEditGroupComposite();//disposes of old and recreates new topComp |
| getTabManager().selectionChanged(part, selection); |
| for (ISection section : getSections()){ |
| section.createControls(_qeGroupComposite, _tabbedPropertySheetPage); |
| section.setInput(part, selection); |
| } |
| _composite.getParent().layout(true, true); |
| |
| aboutToBeShown(); |
| refresh(); |
| } |
| } |
| |
| @Override |
| public void aboutToBeHidden() { |
| super.aboutToBeHidden(); |
| for (ISection section : getSections()){ |
| section.aboutToBeHidden(); |
| } |
| } |
| |
| @Override |
| public void aboutToBeShown() { |
| super.aboutToBeShown(); |
| for (ISection section : getSections()){ |
| section.aboutToBeShown(); |
| } |
| } |
| |
| @Override |
| public void refresh() { |
| super.refresh(); |
| for (ISection section : getSections()){ |
| section.refresh(); |
| } |
| } |
| |
| private void createOrResetQuickEditGroupComposite() { |
| if (_qeGroupComposite != null && !_qeGroupComposite.isDisposed()){ |
| //dispose of current sections |
| disposeCurrentQuickEditTabSections(); |
| _qeGroupComposite.dispose(); |
| } |
| |
| _qeGroupComposite = _tabbedPropertySheetPage.getWidgetFactory().createComposite(_composite, SWT.NO_FOCUS); |
| QuickEditTabLayout layout = new QuickEditTabLayout(); |
| _qeGroupComposite.setLayout(layout); |
| |
| } |
| |
| private void disposeCurrentQuickEditTabSections() { |
| for (ISection section : getSections()){ |
| section.dispose(); |
| } |
| } |
| |
| private List<ISection> getSections(){ |
| if (getTabManager().getCurrentTabGroupDescriptor() != null) |
| return getTabManager().getCurrentTabGroupDescriptor().getSections(); |
| |
| return Collections.EMPTY_LIST; |
| } |
| |
| public void dispose() { |
| super.dispose(); |
| disposeCurrentQuickEditTabSections(); |
| manager.dispose(); |
| manager = null; |
| _composite = null; |
| _qeGroupComposite = null; |
| _tabbedPropertySheetPage = null; |
| } |
| |
| public boolean shouldUseExtraSpace() { |
| return false; |
| } |
| |
| private class QuickEditTabLayout extends Layout { |
| |
| // allow for adjustments |
| private static final int MARGIN = 0; |
| private static final int SPACING = 0; |
| |
| // cache |
| Point[] sizes; |
| int maxWidth, totalHeight; |
| |
| protected Point computeSize(Composite composite, int wHint, int hHint, |
| boolean flushCache) { |
| |
| Control children[] = composite.getChildren(); |
| if (flushCache || sizes == null || sizes.length != children.length) { |
| initialize(children); |
| } |
| |
| int width = wHint, height = hHint; |
| if (wHint == SWT.DEFAULT) |
| width = maxWidth; |
| |
| if (hHint == SWT.DEFAULT) |
| height = totalHeight; |
| |
| return new Point(width + 2 * MARGIN, height + 2 * MARGIN); |
| } |
| |
| protected void layout(Composite composite, boolean flushCache) { |
| Control children[] = composite.getChildren(); |
| if (flushCache || sizes == null || sizes.length != children.length) { |
| initialize(children); |
| } |
| Rectangle rect = composite.getClientArea(); |
| int x = MARGIN, y = MARGIN; |
| int width = Math.max(rect.width - 2 * MARGIN, maxWidth); |
| // System.out.println("--- Comp id: "+composite.toString()+ "[#Children: "+ composite.getChildren().length +"] -------"); |
| for (int i = 0; i < children.length; i++) { |
| int height = sizes[i].y; |
| children[i].setBounds(x, y, width, height); |
| y += height + SPACING; |
| // System.out.println("h="+height+", y="+y); |
| } |
| composite.setRedraw(true); |
| } |
| |
| void initialize(Control children[]) { |
| maxWidth = 0; |
| totalHeight = 0; |
| sizes = new Point[children.length]; |
| for (int i = 0; i < children.length; i++) { |
| sizes[i] = children[i].computeSize(SWT.DEFAULT, SWT.DEFAULT, true); |
| maxWidth = Math.max(maxWidth, sizes[i].x); |
| totalHeight += sizes[i].y; |
| } |
| totalHeight += (children.length - 1) * SPACING; |
| } |
| } |
| } |