Skip to content

Commit

Permalink
535036: [Dark Theme] Catalog switcher misses selection highlight
Browse files Browse the repository at this point in the history
  • Loading branch information
creckord committed May 30, 2018
1 parent ddbd210 commit d727b4b
Show file tree
Hide file tree
Showing 7 changed files with 350 additions and 106 deletions.
5 changes: 5 additions & 0 deletions org.eclipse.epp.mpc.ui.css/css/e4-dark_mpc.css
Expand Up @@ -40,6 +40,11 @@ IEclipsePreferences#org-eclipse-epp-mpc-ui:org-eclipse-ui-themes { /* pseudo att
color: #dddddd;
}

.Catalog:checked,
.Catalog:checked > * {
background-color: COLOR-LIST-SELECTION;
}

#MarketplacePage CTabItem:selected,
#MarketplaceContent,
.MarketplaceSearchHeader,
Expand Down
6 changes: 4 additions & 2 deletions org.eclipse.epp.mpc.ui/META-INF/MANIFEST.MF
Expand Up @@ -26,8 +26,10 @@ Require-Bundle: org.eclipse.core.runtime;bundle-version="3.6.0",
org.eclipse.userstorage;bundle-version="[1.1.0,2.0.0)",
org.eclipse.userstorage.oauth;bundle-version="[1.0.0,2.0.0)",
org.eclipse.userstorage.ui;bundle-version="[1.0.0,2.0.0)",
org.eclipse.ui.ide;bundle-version="3.13.0",
org.eclipse.core.resources;bundle-version="3.12.0"
org.eclipse.ui.ide;bundle-version="[3.13.0,4.0.0)",
org.eclipse.core.resources;bundle-version="[3.12.0,4.0.0)",
org.eclipse.e4.ui.css.core;bundle-version="[0.12.200,1.0.0)",
org.eclipse.e4.ui.css.swt;bundle-version="[0.13.100,1.0.0)"
Export-Package: org.eclipse.epp.internal.mpc.ui;x-internal:=true,
org.eclipse.epp.internal.mpc.ui.actions;x-internal:=true,
org.eclipse.epp.internal.mpc.ui.catalog;x-internal:=true,
Expand Down
9 changes: 9 additions & 0 deletions org.eclipse.epp.mpc.ui/plugin.xml
Expand Up @@ -177,4 +177,13 @@
name="Eclipse Marketplace">
</client>
</extension>
<extension
point="org.eclipse.e4.ui.css.core.elementProvider">
<provider
class="org.eclipse.epp.internal.mpc.ui.wizards.css.CatalogSwitcherItemElementProvider">
<widget
class="org.eclipse.epp.internal.mpc.ui.wizards.CatalogSwitcherItem">
</widget>
</provider>
</extension>
</plugin>
Expand Up @@ -11,44 +11,33 @@
*******************************************************************************/
package org.eclipse.epp.internal.mpc.ui.wizards;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.epp.internal.mpc.ui.MarketplaceClientUiPlugin;
import org.eclipse.epp.internal.mpc.ui.css.StyleHelper;
import org.eclipse.epp.mpc.ui.CatalogDescriptor;
import org.eclipse.equinox.internal.p2.discovery.model.CatalogCategory;
import org.eclipse.equinox.internal.p2.ui.discovery.wizards.CategoryItem;
import org.eclipse.equinox.internal.p2.ui.discovery.wizards.DiscoveryResources;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
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.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
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.Label;

/**
* @author Benjamin Muskalla
Expand All @@ -66,6 +55,8 @@ public class CatalogSwitcher extends Composite implements ISelectionProvider {

private final List<ISelectionChangedListener> listeners = new LinkedList<>();

private final List<CatalogSwitcherItem> items = new LinkedList<>();

private CatalogDescriptor selection;

private Composite marketplaceArea;
Expand Down Expand Up @@ -98,9 +89,21 @@ private void createContents(final Composite parent) {
layout.marginLeft = layout.marginRight = layout.marginTop = layout.marginBottom = layout.marginHeight = layout.marginWidth = 0;
marketplaceArea.setLayout(layout);

SelectionListener selectionListener = SelectionListener.widgetSelectedAdapter(c -> {
Object data = c.data;
if (data instanceof CatalogDescriptor) {
CatalogDescriptor catalogDescriptor = (CatalogDescriptor) data;
this.selection = catalogDescriptor;
refreshSelection();
fireSelectionChanged();
}
});
items.clear();
List<CatalogDescriptor> catalogDescriptors = configuration.getCatalogDescriptors();
for (CatalogDescriptor catalogDescriptor : catalogDescriptors) {
createMarketplace(marketplaceArea, catalogDescriptor);
CatalogSwitcherItem item = createMarketplace(marketplaceArea, catalogDescriptor);
item.addSelectionListener(selectionListener);
items.add(item);
}

scrollArea.setExpandVertical(true);
Expand All @@ -126,64 +129,13 @@ private void createHeader(Composite parent) {
new StyleHelper().on(header).setClass("CatalogSwitcherHeader");
}

private void createMarketplace(Composite composite, final CatalogDescriptor catalogDescriptor) {
Composite container = new Composite(composite, SWT.NONE);
container.setBackgroundMode(SWT.INHERIT_DEFAULT);
container.setData(catalogDescriptor);
GridLayout layout = new GridLayout(1, false);
layout.marginHeight = ITEM_MARGIN;
layout.marginWidth = ITEM_MARGIN;
container.setLayout(layout);

StyleHelper styleHelper = new StyleHelper().on(container);
styleHelper.setClass("Catalog");
styleHelper.setId("catalog-" + composite.getChildren().length);

final Label label = new Label(container, SWT.NONE);
//label.setBackground(container.getBackground());
label.setImage(getDefaultCatalogImage());
styleHelper.on(label).setClass("CatalogImage");

retrieveCatalogImage(catalogDescriptor, label);
label.addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(MouseEvent e) {
selection = catalogDescriptor;
refreshSelection();
fireSelectionChanged();
}
});
CatalogToolTip.attachCatalogToolTip(label, catalogDescriptor);
}
private CatalogSwitcherItem createMarketplace(Composite composite, final CatalogDescriptor catalogDescriptor) {
CatalogSwitcherItem marketplaceItem = new CatalogSwitcherItem(composite, imageRegistry, catalogDescriptor);

private void retrieveCatalogImage(final CatalogDescriptor catalogDescriptor, final Label label) {
//TODO we could simplify all this using the ResourceManager and/or MarketplaceDiscoveryResources,
// if the CatalogDescriptor had the image URL instead of an ImageDescriptor
Job job = new Job(Messages.CatalogSwitcher_retrieveMetaData) {
StyleHelper styleHelper = new StyleHelper().on(marketplaceItem);
styleHelper.setId("catalog-" + composite.getChildren().length);

@Override
protected IStatus run(IProgressMonitor monitor) {
if (label.isDisposed()) {
return Status.OK_STATUS;
}
monitor.beginTask(
NLS.bind(Messages.CatalogSwitcher_downloadCatalogImage, catalogDescriptor.getLabel()), 1);
final Image image = getCatalogIcon(catalogDescriptor);
monitor.worked(1);
if (image != null && !label.isDisposed()) { // recheck - getCatalogIcon can take a bit if it needs to download the image...
label.getDisplay().asyncExec(() -> {
if (!label.isDisposed() && !image.isDisposed()) {
label.setImage(image);
}
});
}
monitor.done();
return Status.OK_STATUS;
}
};
job.setSystem(true);
job.setPriority(Job.DECORATE);
job.schedule();
return marketplaceItem;
}

private void fireSelectionChanged() {
Expand All @@ -193,29 +145,6 @@ private void fireSelectionChanged() {
}
}

private Image getCatalogIcon(final CatalogDescriptor catalogDescriptor) {
String key = catalogDescriptor.getUrl().toExternalForm();
Image image = imageRegistry.get(key);
if (image == null) {
ImageDescriptor catalogIcon = catalogDescriptor.getIcon();
if (catalogIcon == null) {
return getDefaultCatalogImage();
}
imageRegistry.put(key, catalogIcon);
image = imageRegistry.get(key);
if (image == null) {
return getDefaultCatalogImage();
}
}
return image;
}

private Image getDefaultCatalogImage() {
return MarketplaceClientUiPlugin.getInstance()
.getImageRegistry()
.get(MarketplaceClientUiPlugin.NO_ICON_PROVIDED_CATALOG);
}

@Override
public void dispose() {
imageRegistry.dispose();
Expand Down Expand Up @@ -252,21 +181,29 @@ public void setSelection(ISelection newSelection) {
}

private void refreshSelection() {
Control[] children = marketplaceArea.getChildren();
for (Control control : children) {
Color color;
if (this.selection == control.getData()) {
//TODO support styling with :selected pseudo-class
color = getDisplay().getSystemColor(SWT.COLOR_LIST_SELECTION);
} else {
color = this.getBackground();
}
control.setBackground(color);
((Composite) control).getChildren()[0].setBackground(color);
for (CatalogSwitcherItem item : items) {
item.setSelected(this.selection != null && this.selection == item.getCatalogDescriptor());
}
new StyleHelper().on(this).applyStyles();
}

public int getPreferredHeight() {
return MIN_SCROLL_HEIGHT + (2 * getBorderWidth()) + 6;
}

public List<CatalogSwitcherItem> getItems() {
return Collections.unmodifiableList(items);
}

public CatalogSwitcherItem getSelectedItem() {
if (this.selection == null) {
return null;
}
for (CatalogSwitcherItem item : items) {
if (this.selection == item.getCatalogDescriptor()) {
return item;
}
}
return null;
}
}

0 comments on commit d727b4b

Please sign in to comment.