X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=eclipse%2Fplugins%2Forg.argeo.slc.client.ui.dist%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fclient%2Fui%2Fdist%2Fviews%2FArtifactsBrowser.java;h=71cb36ed5d743fb63c31fb2e9886696d884285c0;hb=35a40cc32b67b49c7febab5c8a2127be1f147b47;hp=8c1da64dc74d0aa72b149e2152979301a291544e;hpb=49080f09ed17e6331c95594b012cf1dd5bded8f6;p=gpl%2Fargeo-slc.git diff --git a/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/ArtifactsBrowser.java b/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/ArtifactsBrowser.java index 8c1da64dc..71cb36ed5 100644 --- a/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/ArtifactsBrowser.java +++ b/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/ArtifactsBrowser.java @@ -1,28 +1,61 @@ +/* + * Copyright (C) 2007-2012 Mathieu Baudier + * + * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 + * + * 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 org.argeo.slc.client.ui.dist.views; +import java.text.DateFormat; +import java.text.SimpleDateFormat; + import javax.jcr.Node; +import javax.jcr.Property; +import javax.jcr.PropertyType; import javax.jcr.RepositoryException; import javax.jcr.Session; +import javax.jcr.Value; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.argeo.ArgeoException; +import org.argeo.jcr.JcrUtils; import org.argeo.slc.client.ui.dist.DistConstants; +import org.argeo.slc.client.ui.dist.DistImages; import org.argeo.slc.client.ui.dist.DistPlugin; -import org.argeo.slc.client.ui.dist.providers.ArtifactLabelProvider; import org.argeo.slc.client.ui.dist.providers.ArtifactsTreeContentProvider; import org.argeo.slc.client.ui.dist.utils.GenericDoubleClickListener; +import org.argeo.slc.jcr.SlcTypes; import org.argeo.slc.repo.RepoConstants; +import org.eclipse.jface.viewers.ColumnLabelProvider; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeColumn; import org.eclipse.ui.part.ViewPart; /** - * Basic View to browse a maven base repository + * Basic View to browse a maven based repository. + * + * By Default size of the various bundles is not computed but it can be + * activated the view command. */ public class ArtifactsBrowser extends ViewPart implements DistConstants, @@ -32,20 +65,28 @@ public class ArtifactsBrowser extends ViewPart implements DistConstants, /* DEPENDENCY INJECTION */ private Session jcrSession; + // Business objects private Node rootNode; // This page widgets private TreeViewer artifactTreeViewer; + private boolean isSizeVisible = false; + + // To be able to configure columns easily + public static final int COLUMN_TREE = 0; + public static final int COLUMN_DATE = 1; + public static final int COLUMN_SIZE = 2; + private static final int SIZE_COL_WIDTH = 55; @Override public void createPartControl(Composite parent) { - GridLayout gl = new GridLayout(1, false); - parent.setLayout(gl); + // Enable the different parts to fill the whole page when the tab is + // maximized + parent.setLayout(new FillLayout()); artifactTreeViewer = createArtifactsTreeViewer(parent); // context menu : it is completely defined in the plugin.xml file. - // Nothing in the context menu for the time being // MenuManager menuManager = new MenuManager(); // Menu menu = @@ -72,7 +113,7 @@ public class ArtifactsBrowser extends ViewPart implements DistConstants, Tree tree = new Tree(parent, style); createColumn(tree, "Artifacts", SWT.LEFT, 300); createColumn(tree, "Date created", SWT.LEFT, 105); - createColumn(tree, "Size", SWT.RIGHT, 55); + createColumn(tree, "Size", SWT.RIGHT, 0); tree.setLinesVisible(true); tree.setHeaderVisible(true); @@ -80,8 +121,10 @@ public class ArtifactsBrowser extends ViewPart implements DistConstants, viewer.setContentProvider(new ArtifactsTreeContentProvider()); viewer.setLabelProvider(new ArtifactLabelProvider()); + viewer.addSelectionChangedListener(new ArtifactTreeSelectionListener()); viewer.addDoubleClickListener(new GenericDoubleClickListener(viewer)); viewer.setInput(rootNode); + return viewer; } @@ -102,6 +145,149 @@ public class ArtifactsBrowser extends ViewPart implements DistConstants, @Override public void setFocus() { // TODO Auto-generated method stub + + } + + /** + * Refresh the given element of the tree browser. If null is passed as a + * parameter, it refreshes the whole tree + */ + public void refresh(Object element) { + if (element == null) { + artifactTreeViewer.refresh(rootNode); + } else + artifactTreeViewer.refresh(element); + } + + /** Returns wether size column is visible or not */ + public boolean isSizeVisible() { + return isSizeVisible; + } + + /** Sets the visibility of the size column */ + public void setSizeVisible(boolean visible) { + if (isSizeVisible == visible) + return; // nothing has changed + else + isSizeVisible = visible; + + if (visible) { + artifactTreeViewer.getTree().getColumn(COLUMN_SIZE) + .setWidth(SIZE_COL_WIDTH); + } else { + // we just hide the column, we don't refresh the whole tree. + artifactTreeViewer.getTree().getColumn(COLUMN_SIZE).setWidth(0); + } + } + + private class ArtifactLabelProvider extends ColumnLabelProvider implements + DistConstants, SlcTypes { + + // Utils + protected DateFormat timeFormatter = new SimpleDateFormat( + DATE_TIME_FORMAT); + + public void update(ViewerCell cell) { + int colIndex = cell.getColumnIndex(); + Object element = cell.getElement(); + cell.setText(getColumnText(element, colIndex)); + + if (element instanceof Node && colIndex == 0) { + Node node = (Node) element; + try { + if (node.isNodeType(SLC_ARTIFACT_BASE)) + cell.setImage(DistImages.IMG_ARTIFACT_BASE); + else if (node.isNodeType(SLC_ARTIFACT_VERSION_BASE)) + cell.setImage(DistImages.IMG_ARTIFACT_VERSION_BASE); + } catch (RepositoryException e) { + // Silent + } + } + } + + @Override + public Image getImage(Object element) { + + if (element instanceof Node) { + Node node = (Node) element; + try { + if (node.isNodeType(SLC_ARTIFACT_BASE)) { + return DistImages.IMG_ARTIFACT_BASE; + } else if (node.isNodeType(SLC_ARTIFACT_VERSION_BASE)) { + return DistImages.IMG_ARTIFACT_VERSION_BASE; + } + } catch (RepositoryException e) { + // Silent + } + } + return null; + } + + public String getColumnText(Object element, int columnIndex) { + try { + if (element instanceof Node) { + Node node = (Node) element; + switch (columnIndex) { + case COLUMN_TREE: + return node.getName(); + case COLUMN_SIZE: + if (isSizeVisible) { + long size = JcrUtils.getNodeApproxSize(node) / 1024; + if (size > 1024) + return size / 1024 + " MB"; + else + return size + " KB"; + } else + return ""; + case COLUMN_DATE: + if (node.hasProperty(Property.JCR_CREATED)) + return timeFormatter.format(node + .getProperty(Property.JCR_CREATED) + .getDate().getTime()); + else + return null; + } + } + } catch (RepositoryException re) { + throw new ArgeoException( + "Unexepected error while getting property values", re); + } + return null; + } + + private String formatValueAsString(Value value) { + // TODO enhance this method + try { + String strValue; + + if (value.getType() == PropertyType.BINARY) + strValue = ""; + else if (value.getType() == PropertyType.DATE) + strValue = timeFormatter.format(value.getDate().getTime()); + else + strValue = value.getString(); + return strValue; + } catch (RepositoryException e) { + throw new ArgeoException( + "unexpected error while formatting value", e); + } + } + } + + private class ArtifactTreeSelectionListener implements + ISelectionChangedListener { + + public void selectionChanged(SelectionChangedEvent event) { + ISelection selection = event.getSelection(); + if (selection != null && selection instanceof IStructuredSelection) { + IStructuredSelection iss = (IStructuredSelection) selection; + if (iss.size() == 1) { + artifactTreeViewer.refresh(iss.getFirstElement()); + } + } + + } + } /* DEPENDENCY INJECTION */