diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/AccordionControl.java')
-rw-r--r-- | eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/AccordionControl.java | 396 |
1 files changed, 0 insertions, 396 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/AccordionControl.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/AccordionControl.java deleted file mode 100644 index b3dce0756..000000000 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/AccordionControl.java +++ /dev/null @@ -1,396 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Eclipse Public License, Version 1.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.eclipse.org/org/documents/epl-v10.php - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.ide.eclipse.adt.internal.editors.layout.gle2; - -import com.android.ide.eclipse.adt.internal.editors.IconFactory; - -import org.eclipse.jface.resource.JFaceResources; -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.CLabel; -import org.eclipse.swt.custom.ScrolledComposite; -import org.eclipse.swt.events.ControlAdapter; -import org.eclipse.swt.events.ControlEvent; -import org.eclipse.swt.events.MouseAdapter; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.MouseTrackListener; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Font; -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.layout.RowLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.ScrollBar; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -/** - * The accordion control allows a series of labels with associated content that can be - * shown. For more details on accordions, see http://en.wikipedia.org/wiki/Accordion_(GUI) - * <p> - * This control allows the children to be created lazily. You can also customize the - * composite which is created to hold the children items, to for example allow multiple - * columns of items rather than just the default vertical stack. - * <p> - * The visual appearance of the headers is built in; it uses a mild gradient, with a - * heavier gradient during mouse-overs. It also uses a bold label along with the eclipse - * folder icons. - * <p> - * The control can be configured to enforce a single category open at any time (the - * default), or allowing multiple categories open (where they share the available space). - * The control can also be configured to fill the available vertical space for the open - * category/categories. - */ -public abstract class AccordionControl extends Composite { - /** Pixel spacing between header items */ - private static final int HEADER_SPACING = 0; - - /** Pixel spacing between items in the content area */ - private static final int ITEM_SPACING = 0; - - private static final String KEY_CONTENT = "content"; //$NON-NLS-1$ - private static final String KEY_HEADER = "header"; //$NON-NLS-1$ - - private Image mClosed; - private Image mOpen; - private boolean mSingle = true; - private boolean mWrap; - - /** - * Creates the container which will hold the items in a category; this can be - * overridden to lay out the children with a different layout than the default - * vertical RowLayout - */ - protected Composite createChildContainer(Composite parent, Object header, int style) { - Composite composite = new Composite(parent, style); - if (mWrap) { - RowLayout layout = new RowLayout(SWT.HORIZONTAL); - layout.center = true; - composite.setLayout(layout); - } else { - RowLayout layout = new RowLayout(SWT.VERTICAL); - layout.spacing = ITEM_SPACING; - layout.marginHeight = 0; - layout.marginWidth = 0; - layout.marginLeft = 0; - layout.marginTop = 0; - layout.marginRight = 0; - layout.marginBottom = 0; - composite.setLayout(layout); - } - - // TODO - maybe do multi-column arrangement for simple nodes - return composite; - } - - /** - * Creates the children under a particular header - * - * @param parent the parent composite to add the SWT items to - * @param header the header object that is being opened for the first time - */ - protected abstract void createChildren(Composite parent, Object header); - - /** - * Set whether a single category should be enforced or not (default=true) - * - * @param single if true, enforce a single category open at a time - */ - public void setAutoClose(boolean single) { - mSingle = single; - } - - /** - * Returns whether a single category should be enforced or not (default=true) - * - * @return true if only a single category can be open at a time - */ - public boolean isAutoClose() { - return mSingle; - } - - /** - * Returns the labels used as header categories - * - * @return list of header labels - */ - public List<CLabel> getHeaderLabels() { - List<CLabel> headers = new ArrayList<CLabel>(); - for (Control c : getChildren()) { - if (c instanceof CLabel) { - headers.add((CLabel) c); - } - } - - return headers; - } - - /** - * Show all categories - * - * @param performLayout if true, call {@link #layout} and {@link #pack} when done - */ - public void expandAll(boolean performLayout) { - for (Control c : getChildren()) { - if (c instanceof CLabel) { - if (!isOpen(c)) { - toggle((CLabel) c, false, false); - } - } - } - if (performLayout) { - pack(); - layout(); - } - } - - /** - * Hide all categories - * - * @param performLayout if true, call {@link #layout} and {@link #pack} when done - */ - public void collapseAll(boolean performLayout) { - for (Control c : getChildren()) { - if (c instanceof CLabel) { - if (isOpen(c)) { - toggle((CLabel) c, false, false); - } - } - } - if (performLayout) { - layout(); - } - } - - /** - * Create the composite. - * - * @param parent the parent widget to add the accordion to - * @param style the SWT style mask to use - * @param headers a list of headers, whose {@link Object#toString} method should - * produce the heading label - * @param greedy if true, grow vertically as much as possible - * @param wrapChildren if true, configure the child area to be horizontally laid out - * with wrapping - * @param expand Set of headers to expand initially - */ - public AccordionControl(Composite parent, int style, List<?> headers, - boolean greedy, boolean wrapChildren, Set<String> expand) { - super(parent, style); - mWrap = wrapChildren; - - GridLayout gridLayout = new GridLayout(1, false); - gridLayout.verticalSpacing = HEADER_SPACING; - gridLayout.horizontalSpacing = 0; - gridLayout.marginWidth = 0; - gridLayout.marginHeight = 0; - setLayout(gridLayout); - - Font labelFont = null; - - mOpen = IconFactory.getInstance().getIcon("open-folder"); //$NON-NLS-1$ - mClosed = IconFactory.getInstance().getIcon("closed-folder"); //$NON-NLS-1$ - List<CLabel> expandLabels = new ArrayList<CLabel>(); - - for (Object header : headers) { - final CLabel label = new CLabel(this, SWT.SHADOW_OUT); - label.setText(header.toString().replace("&", "&&")); //$NON-NLS-1$ //$NON-NLS-2$ - updateBackground(label, false); - if (labelFont == null) { - labelFont = JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT); - } - label.setFont(labelFont); - label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); - setHeader(header, label); - label.addMouseListener(new MouseAdapter() { - @Override - public void mouseUp(MouseEvent e) { - if (e.button == 1 && (e.stateMask & SWT.MODIFIER_MASK) == 0) { - toggle(label, true, mSingle); - } - } - }); - label.addMouseTrackListener(new MouseTrackListener() { - @Override - public void mouseEnter(MouseEvent e) { - updateBackground(label, true); - } - - @Override - public void mouseExit(MouseEvent e) { - updateBackground(label, false); - } - - @Override - public void mouseHover(MouseEvent e) { - } - }); - - // Turn off border? - final ScrolledComposite scrolledComposite = new ScrolledComposite(this, SWT.V_SCROLL); - ScrollBar verticalBar = scrolledComposite.getVerticalBar(); - verticalBar.setIncrement(20); - verticalBar.setPageIncrement(100); - - // Do we need the scrolled composite or can we just look at the next - // wizard in the hierarchy? - - setContentArea(label, scrolledComposite); - scrolledComposite.setExpandHorizontal(true); - scrolledComposite.setExpandVertical(true); - GridData scrollGridData = new GridData(SWT.FILL, - greedy ? SWT.FILL : SWT.TOP, false, greedy, 1, 1); - scrollGridData.exclude = true; - scrollGridData.grabExcessHorizontalSpace = wrapChildren; - scrolledComposite.setLayoutData(scrollGridData); - - if (wrapChildren) { - scrolledComposite.addControlListener(new ControlAdapter() { - @Override - public void controlResized(ControlEvent e) { - Rectangle r = scrolledComposite.getClientArea(); - Control content = scrolledComposite.getContent(); - if (content != null && r != null) { - Point minSize = content.computeSize(r.width, SWT.DEFAULT); - scrolledComposite.setMinSize(minSize); - ScrollBar vBar = scrolledComposite.getVerticalBar(); - vBar.setPageIncrement(r.height); - } - } - }); - } - - updateIcon(label); - if (expand != null && expand.contains(label.getText())) { - // Comparing "label.getText()" rather than "header" because we make some - // tweaks to the label (replacing & with && etc) and in the getExpandedCategories - // method we return the label texts - expandLabels.add(label); - } - } - - // Expand the requested categories - for (CLabel label : expandLabels) { - toggle(label, false, false); - } - } - - /** Updates the background gradient of the given header label */ - private void updateBackground(CLabel label, boolean mouseOver) { - Display display = label.getDisplay(); - label.setBackground(new Color[] { - display.getSystemColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW), - display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND), - display.getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW) - }, new int[] { - mouseOver ? 60 : 40, 100 - }, true); - } - - /** - * Updates the icon for a header label to be open/close based on the {@link #isOpen} - * state - */ - private void updateIcon(CLabel label) { - label.setImage(isOpen(label) ? mOpen : mClosed); - } - - /** Returns true if the content area for the given label is open/showing */ - private boolean isOpen(Control label) { - return !((GridData) getContentArea(label).getLayoutData()).exclude; - } - - /** Toggles the visibility of the children of the given label */ - private void toggle(CLabel label, boolean performLayout, boolean autoClose) { - if (autoClose) { - collapseAll(true); - } - ScrolledComposite scrolledComposite = getContentArea(label); - - GridData scrollGridData = (GridData) scrolledComposite.getLayoutData(); - boolean close = !scrollGridData.exclude; - scrollGridData.exclude = close; - scrolledComposite.setVisible(!close); - updateIcon(label); - - if (!scrollGridData.exclude && scrolledComposite.getContent() == null) { - Object header = getHeader(label); - Composite composite = createChildContainer(scrolledComposite, header, SWT.NONE); - createChildren(composite, header); - while (composite.getParent() != scrolledComposite) { - composite = composite.getParent(); - } - scrolledComposite.setContent(composite); - scrolledComposite.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT)); - } - - if (performLayout) { - layout(true); - } - } - - /** Returns the header object for the given header label */ - private Object getHeader(Control label) { - return label.getData(KEY_HEADER); - } - - /** Sets the header object for the given header label */ - private void setHeader(Object header, final CLabel label) { - label.setData(KEY_HEADER, header); - } - - /** Returns the content area for the given header label */ - private ScrolledComposite getContentArea(Control label) { - return (ScrolledComposite) label.getData(KEY_CONTENT); - } - - /** Sets the content area for the given header label */ - private void setContentArea(final CLabel label, ScrolledComposite scrolledComposite) { - label.setData(KEY_CONTENT, scrolledComposite); - } - - @Override - protected void checkSubclass() { - // Disable the check that prevents subclassing of SWT components - } - - /** - * Returns the set of expanded categories in the palette. Note: Header labels will have - * escaped ampersand characters with double ampersands. - * - * @return the set of expanded categories in the palette - never null - */ - public Set<String> getExpandedCategories() { - Set<String> expanded = new HashSet<String>(); - for (Control c : getChildren()) { - if (c instanceof CLabel) { - if (isOpen(c)) { - expanded.add(((CLabel) c).getText()); - } - } - } - - return expanded; - } -} |