diff options
Diffstat (limited to 'bundles/org.eclipse.equinox.p2.ui.discovery/src/org/eclipse/equinox/internal/p2/ui/discovery/util/ControlListItem.java')
-rw-r--r-- | bundles/org.eclipse.equinox.p2.ui.discovery/src/org/eclipse/equinox/internal/p2/ui/discovery/util/ControlListItem.java | 282 |
1 files changed, 282 insertions, 0 deletions
diff --git a/bundles/org.eclipse.equinox.p2.ui.discovery/src/org/eclipse/equinox/internal/p2/ui/discovery/util/ControlListItem.java b/bundles/org.eclipse.equinox.p2.ui.discovery/src/org/eclipse/equinox/internal/p2/ui/discovery/util/ControlListItem.java new file mode 100644 index 000000000..86874122c --- /dev/null +++ b/bundles/org.eclipse.equinox.p2.ui.discovery/src/org/eclipse/equinox/internal/p2/ui/discovery/util/ControlListItem.java @@ -0,0 +1,282 @@ +/******************************************************************************* + * Copyright (c) 2005, 2009 IBM 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: + * IBM Corporation - initial API and implementation + * Tasktop Technologies - generalized ProgressInfoItem for reuse + *******************************************************************************/ + +package org.eclipse.equinox.internal.p2.ui.discovery.util; + +import org.eclipse.core.runtime.Assert; +import org.eclipse.jface.resource.JFaceResources; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.MouseAdapter; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseTrackAdapter; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.RGB; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.ui.PlatformUI; + +/** + * Based on {@link org.eclipse.ui.internal.progress.ProgressInfoItem}. + * + * @author Steffen Pingel + */ +public abstract class ControlListItem<T> extends Composite { + + static String DARK_COLOR_KEY = "org.eclipse.mylyn.commons.ui.ControlListItem.DARK_COLOR"; //$NON-NLS-1$ + + interface IndexListener { + + /** + * Select the item previous to the receiver. + */ + public void selectPrevious(); + + /** + * Select the next previous to the receiver. + */ + public void selectNext(); + + /** + * Select the receiver. + */ + public void select(); + + public void open(); + + } + + IndexListener indexListener; + + private int currentIndex; + + private boolean selected; + + private final MouseAdapter mouseListener; + + private boolean isShowing = true; + + private final MouseTrackAdapter mouseTrackListener; + + private boolean hot; + + static { + // Mac has different Gamma value + int shift = "carbon".equals(SWT.getPlatform()) ? -25 : -10;//$NON-NLS-1$ + + Color lightColor = PlatformUI.getWorkbench().getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND); + + // Determine a dark color by shifting the list color + RGB darkRGB = new RGB(Math.max(0, lightColor.getRed() + shift), Math.max(0, lightColor.getGreen() + shift), + Math.max(0, lightColor.getBlue() + shift)); + JFaceResources.getColorRegistry().put(DARK_COLOR_KEY, darkRGB); + } + + /** + * Create a new instance of the receiver with the specified parent, style and info object/ + * + * @param parent + * @param style + * @param progressInfo + */ + public ControlListItem(Composite parent, int style, T element) { + super(parent, style | SWT.NO_FOCUS); + Assert.isNotNull(element); + super.setData(element); + setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false)); + mouseListener = doCreateMouseListener(); + mouseTrackListener = doCreateMouseTrackListener(); + registerChild(this); +// Control[] children = getChildren(); +// for (Control child : children) { +// registerChild(child); +// } + setHot(false); + } + + @SuppressWarnings("unchecked") + @Override + public T getData() { + return (T) super.getData(); + } + + @Override + public void setData(Object data) { + throw new IllegalArgumentException(); + } + + private MouseTrackAdapter doCreateMouseTrackListener() { + return new MouseTrackAdapter() { + private int enterCount; + + @Override + public void mouseEnter(MouseEvent e) { + enterCount++; + updateHotState(); + } + + @Override + public void mouseExit(MouseEvent e) { + enterCount--; + getDisplay().asyncExec(new Runnable() { + public void run() { + if (!isDisposed()) { + updateHotState(); + } + } + }); + } + + private void updateHotState() { + if (enterCount == 0) { + if (isHot()) { + setHot(false); + } + } else { + if (!isHot()) { + setHot(true); + } + } + } + }; + } + + private MouseAdapter doCreateMouseListener() { + return new MouseAdapter() { + @Override + public void mouseDown(MouseEvent e) { + if (indexListener != null) { + if (e.count == 2) { + indexListener.open(); + } else { + indexListener.select(); + } + } + } + }; + } + + public boolean isHot() { + return hot; + } + + public void setHot(boolean hot) { + this.hot = hot; + } + + protected void registerChild(Control child) { + child.addMouseListener(mouseListener); + child.addMouseTrackListener(mouseTrackListener); + + } + + /** + * Refresh the contents of the receiver. + */ + protected abstract void refresh(); + + /** + * Set the color base on the index + * + * @param index + */ + public void updateColors(int index) { + currentIndex = index; + + if (selected) { + setBackground(getDisplay().getSystemColor(SWT.COLOR_LIST_SELECTION)); + setForeground(getDisplay().getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT)); + } else { + if (index % 2 == 0) { + setBackground(JFaceResources.getColorRegistry().get(DARK_COLOR_KEY)); + } else { + setBackground(getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND)); + } + setForeground(getDisplay().getSystemColor(SWT.COLOR_LIST_FOREGROUND)); + } + } + + @Override + public void setForeground(Color color) { + super.setForeground(color); + Control[] children = getChildren(); + for (Control child : children) { + child.setForeground(color); + } + } + + @Override + public void setBackground(Color color) { + super.setBackground(color); + Control[] children = getChildren(); + for (Control child : children) { + child.setBackground(color); + } + } + + /** + * Set the selection colors. + * + * @param select + * boolean that indicates whether or not to show selection. + */ + public void setSelected(boolean select) { + selected = select; + updateColors(currentIndex); + } + + /** + * Set the listener for index changes. + * + * @param indexListener + */ + void setIndexListener(IndexListener indexListener) { + this.indexListener = indexListener; + } + + /** + * Return whether or not the receiver is selected. + * + * @return boolean + */ + public boolean isSelected() { + return selected; + } + + /** + * Set whether or not the receiver is being displayed based on the top and bottom of the currently visible area. + * + * @param top + * @param bottom + */ + void setDisplayed(int top, int bottom) { + int itemTop = getLocation().y; + int itemBottom = itemTop + getBounds().height; + setDisplayed(itemTop <= bottom && itemBottom > top); + + } + + /** + * Set whether or not the receiver is being displayed + * + * @param displayed + */ + private void setDisplayed(boolean displayed) { + // See if this element has been turned off + boolean refresh = !isShowing && displayed; + isShowing = displayed; + if (refresh) { + refresh(); + } + } + +} |