Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(103)

Unified Diff: editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/internal/pub/PackagesView.java

Issue 24235011: add a view for users to explore pub packages (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/internal/pub/PackagesView.java
===================================================================
--- editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/internal/pub/PackagesView.java (revision 0)
+++ editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/internal/pub/PackagesView.java (revision 0)
@@ -0,0 +1,413 @@
+/*
+ * Copyright (c) 2013, the Dart project authors.
+ *
+ * Licensed under the Eclipse Public License v1.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/legal/epl-v10.html
+ *
+ * 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.google.dart.tools.ui.internal.pub;
+
+import com.google.dart.tools.core.pub.IPubPackageListener;
+import com.google.dart.tools.core.pub.PubPackageManager;
+import com.google.dart.tools.core.pub.PubPackageObject;
+import com.google.dart.tools.ui.DartToolsPlugin;
+import com.google.dart.tools.ui.internal.util.ExternalBrowserUtil;
+
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.layout.TableColumnLayout;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StyledCellLabelProvider;
+import org.eclipse.jface.viewers.StyledString;
+import org.eclipse.jface.viewers.StyledString.Styler;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerCell;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.jface.window.ToolTip;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.TextStyle;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.part.ViewPart;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A view that shows the packages available on pub with the descriptions and latest versions. Users
+ * can create a copy of the package to explore the package or can view package documentation on pub.
+ */
+public class PackagesView extends ViewPart {
+
+ class PackagesComparator extends ViewerComparator {
+
+ private static final int DESCENDING = 1;
+ private int direction;
+
+ public PackagesComparator() {
+ direction = DESCENDING;
+ }
+
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ if (e1 instanceof PubPackageObject) {
+ PubPackageObject t1 = (PubPackageObject) e1;
+ PubPackageObject t2 = (PubPackageObject) e2;
+ int result = t1.getName().compareTo(t2.getName());
+ if (direction == DESCENDING) {
+ result *= -1;
+ }
+ return result;
+ }
+ return -1;
+ }
+
+ public void setColumn(int column) {
+ if (column == 0) {
+ direction = -1 * direction;
+ } else {
+ direction = DESCENDING;
+ }
+ }
+
+ }
+
+ class PackagesFilter extends ViewerFilter {
+
+ private String searchString;
+
+ @Override
+ public boolean select(Viewer viewer, Object parentElement, Object element) {
+ if (searchString == null || searchString.length() == 0) {
+ return true;
+ }
+
+ if (((PubPackageObject) element).getName().matches(searchString)
+ || ((PubPackageObject) element).getDescription().matches(searchString)) {
+ return true;
+ }
+ return false;
+ }
+
+ public void setSearchText(String s) {
+ this.searchString = "(?i).*" + s + ".*";
+ }
+
+ }
+
+ class PackagesLabelProvider extends StyledCellLabelProvider {
+
+ @Override
+ public String getToolTipText(Object element) {
+ if (element instanceof PubPackageObject) {
+ return ((PubPackageObject) element).getDescription();
+ }
+ return null;
+ }
+
+ @Override
+ public void update(ViewerCell cell) {
+ Object element = cell.getElement();
+
+ if (element instanceof PubPackageObject) {
+ String string = "";
+ StyledString styledString = new StyledString();
+ switch (cell.getColumnIndex()) {
+ case 0:
+ string = ((PubPackageObject) element).getName();
+ styledString = new StyledString(string, boldStyler);
+ break;
+ case 1:
+ string = ((PubPackageObject) element).getDescription();
+ styledString = new StyledString(string, italicStyler);
+ break;
+ case 2:
+ string = ((PubPackageObject) element).getVersion();
+ styledString = new StyledString(string);
+ break;
+ }
+
+ cell.setText(styledString.toString());
+ cell.setStyleRanges(styledString.getStyleRanges());
+
+ if (cell.getColumnIndex() == 0) {
+ cell.setImage(DartToolsPlugin.getImage("icons/full/obj16/package_obj.gif"));
+ }
+
+ } else {
+ if (element instanceof String) {
+ cell.setText((String) element);
+ } else {
+ cell.setText("Unknown element"); //$NON-NLS-1$
+ }
+ }
+ super.update(cell);
+ }
+ }
+
+ class PubPackageListener implements IPubPackageListener {
+ @Override
+ public void pubPackagesChanged(final List<PubPackageObject> packages) {
+ Display.getDefault().syncExec(new Runnable() {
+
+ @Override
+ public void run() {
+ pubPackages = packages;
+ tableViewer.setInput(pubPackages);
+ tableViewer.refresh();
+ }
+ });
+
+ }
+ }
+
+ public static String ID = "com.google.dart.tools.ui.view.packages";
+
+ private static Styler italicStyler;
+
+ private static Styler boldStyler;
+
+ private static FontData[] getModifiedFontData(FontData[] originalData, int additionalStyle) {
+ FontData[] styleData = new FontData[originalData.length];
+ for (int i = 0; i < styleData.length; i++) {
+ FontData base = originalData[i];
+ styleData[i] = new FontData(base.getName(), base.getHeight(), base.getStyle()
+ | additionalStyle);
+ }
+ return styleData;
+ }
+
+ private PackagesFilter filter;
+ private TableViewer tableViewer;
+ private Text filterText;
+ private Font boldFont;
+ private Font italicFont;
+
+ private List<PubPackageObject> pubPackages;
+
+ private PubPackageListener packageListener = new PubPackageListener();
+
+ private PackagesComparator comparator;;
+
+ @Override
+ public void createPartControl(Composite parent) {
+
+ Composite client = new Composite(parent, SWT.NONE);
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(client);
+ GridLayoutFactory.swtDefaults().spacing(10, 5).numColumns(1).applyTo(client);
+
+ Composite filterComp = new Composite(client, SWT.NONE);
+ GridDataFactory.fillDefaults().align(SWT.LEFT, SWT.FILL).grab(false, false).applyTo(filterComp);
+ GridLayoutFactory.swtDefaults().numColumns(2).applyTo(filterComp);
+
+ Label filterLabel = new Label(filterComp, SWT.NONE);
+ filterLabel.setText("Search by name or description: ");
+ GridDataFactory.fillDefaults().align(SWT.LEFT, SWT.FILL).grab(false, false).applyTo(filterLabel);
+
+ filterText = new Text(filterComp, SWT.BORDER | SWT.SEARCH);
+ GridDataFactory.fillDefaults().align(SWT.LEFT, SWT.CENTER).hint(200, SWT.DEFAULT).applyTo(
+ filterText);
+ filterText.addKeyListener(new KeyAdapter() {
+ @Override
+ public void keyReleased(KeyEvent ke) {
+ filter.setSearchText(filterText.getText());
+ tableViewer.refresh();
+ }
+ });
+
+ createTable(client);
+
+ PubPackageManager.getInstance().addListener(packageListener);
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ boldFont.dispose();
+ italicFont.dispose();
+ PubPackageManager.getInstance().removeListener(packageListener);
+ }
+
+ @Override
+ public void setFocus() {
+
+ }
+
+ private TableViewerColumn createColumnsAndMenu(TableColumnLayout tableLayout) {
+ String[] titles = {"Name", "Description", "Version"};
+ final TableViewerColumn nameColumn = createTableViewerColumn(titles[0], 0);
+ TableViewerColumn descColumn = createTableViewerColumn(titles[1], 1);
+ TableViewerColumn versionColumn = createTableViewerColumn(titles[2], 2);
+
+ nameColumn.getColumn().pack();
+ descColumn.getColumn().pack();
+ versionColumn.getColumn().pack();
+ int stylesheetWidth = nameColumn.getColumn().getWidth();
+ int conceptWidth = descColumn.getColumn().getWidth();
+ tableLayout.setColumnData(nameColumn.getColumn(), new ColumnWeightData(20, stylesheetWidth));
+ tableLayout.setColumnData(descColumn.getColumn(), new ColumnWeightData(73, conceptWidth));
+ tableLayout.setColumnData(versionColumn.getColumn(), new ColumnWeightData(7));
+ nameColumn.getColumn().addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ comparator.setColumn(0);
+ int dir = tableViewer.getTable().getSortDirection();
+ dir = dir == SWT.DOWN ? SWT.UP : SWT.DOWN;
+ tableViewer.getTable().setSortDirection(dir);
+ tableViewer.getTable().setSortColumn(nameColumn.getColumn());
+ tableViewer.refresh();
+ }
+ });
+
+ // define the menu and assign to the table
+ Menu headerMenu = new Menu(tableViewer.getTable());
+ tableViewer.getTable().setMenu(headerMenu);
+ createImportMenuItem(headerMenu, nameColumn.getColumn());
+ createBrowseMenuItem(headerMenu, nameColumn.getColumn());
+ return nameColumn;
+ }
+
+ private void createFontStyles() {
+ boldFont = getBoldFont(tableViewer.getTable().getFont().getFontData());
+ boldStyler = new Styler() {
+ @Override
+ public void applyStyles(TextStyle textStyle) {
+ textStyle.font = boldFont;
+ }
+ };
+
+ italicFont = getItalicFont(tableViewer.getTable().getFont().getFontData());
+ italicStyler = new Styler() {
+ @Override
+ public void applyStyles(TextStyle textStyle) {
+ textStyle.font = italicFont;
+ }
+ };
+ }
+
+ private void createImportMenuItem(Menu parent, TableColumn column) {
+ final MenuItem itemName = new MenuItem(parent, SWT.PUSH);
+ itemName.setText("New application from package");
+ itemName.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ PubPackageObject selection = (PubPackageObject) ((IStructuredSelection) tableViewer.getSelection()).getFirstElement();
+ if (selection != null) {
+ AddPackageAction action = new AddPackageAction(
+ getSite(),
+ selection.getName(),
+ selection.getVersion());
+ action.run();
+ }
+ }
+ });
+ }
+
+ private void createBrowseMenuItem(Menu parent, final TableColumn column) {
+ final MenuItem itemName = new MenuItem(parent, SWT.PUSH);
+ itemName.setText("Browse docs on pub.dartlang.org");
+ itemName.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ PubPackageObject selection = (PubPackageObject) ((IStructuredSelection) tableViewer.getSelection()).getFirstElement();
+ if (selection != null) {
+ ExternalBrowserUtil.openInExternalBrowser("http://pub.dartlang.org/packages/"
+ + selection.getName());
+ }
+ }
+ });
+ }
+
+ private void createTable(Composite client) {
+
+ Composite tableComposite = new Composite(client, SWT.NONE);
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).grab(true, true).applyTo(
+ tableComposite);
+ TableColumnLayout tableLayout = new TableColumnLayout();
+ tableComposite.setLayout(tableLayout);
+
+ tableViewer = new TableViewer(tableComposite, SWT.HIDE_SELECTION | SWT.FULL_SELECTION
+ | SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.WRAP);
+ final Table table = tableViewer.getTable();
+ table.setLinesVisible(true);
+ table.setHeaderVisible(true);
+
+ createFontStyles();
+
+ final TableViewerColumn nameColumn = createColumnsAndMenu(tableLayout);
+
+ tableViewer.setContentProvider(new ArrayContentProvider());
+ tableViewer.setLabelProvider(new PackagesLabelProvider());
+ tableViewer.getTable().setSortColumn(nameColumn.getColumn());
+ tableViewer.getTable().setSortDirection(SWT.DOWN);
+ comparator = new PackagesComparator();
+ comparator.setColumn(0);
+ tableViewer.setComparator(comparator);
+
+ filter = new PackagesFilter();
+ tableViewer.addFilter(filter);
+ ColumnViewerToolTipSupport.enableFor(tableViewer, ToolTip.NO_RECREATE);
+
+ pubPackages = PubPackageManager.getInstance().getPubPackages();
+ if (pubPackages.size() > 0) {
+ tableViewer.setInput(pubPackages);
+ } else {
+ List<String> strings = new ArrayList<String>();
+ for (int i = 0; i < 25; i++) {
+ strings.add("Populating data ...");
+ }
+ tableViewer.setInput(strings);
+ }
+
+ }
+
+ private TableViewerColumn createTableViewerColumn(String title, final int colNumber) {
+ final TableViewerColumn viewerColumn = new TableViewerColumn(tableViewer, SWT.H_SCROLL
+ | SWT.V_SCROLL | SWT.WRAP);
+ final TableColumn column = viewerColumn.getColumn();
+ column.setText(title);
+ column.setResizable(true);
+ return viewerColumn;
+ }
+
+ private Font getBoldFont(FontData[] fontData) {
+ FontData[] boldFontData = getModifiedFontData(fontData, SWT.BOLD);
+
+ Font boldFont = new Font(Display.getCurrent(), boldFontData);
+ return boldFont;
+ }
+
+ private Font getItalicFont(FontData[] fontData) {
+ FontData[] iFontData = getModifiedFontData(fontData, SWT.ITALIC);
+
+ Font italicFont = new Font(Display.getCurrent(), iFontData);
+ return italicFont;
+ }
+
+}

Powered by Google App Engine
This is Rietveld 408576698