2 * Copyright (C) 2007-2012 Argeo GmbH
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package org
.argeo
.slc
.client
.ui
.dist
.views
;
18 import java
.text
.DateFormat
;
19 import java
.text
.SimpleDateFormat
;
21 import javax
.jcr
.Node
;
22 import javax
.jcr
.Property
;
23 import javax
.jcr
.RepositoryException
;
24 import javax
.jcr
.Session
;
26 import org
.argeo
.jcr
.JcrUtils
;
27 import org
.argeo
.slc
.SlcException
;
28 import org
.argeo
.slc
.SlcTypes
;
29 import org
.argeo
.slc
.client
.ui
.dist
.DistConstants
;
30 import org
.argeo
.slc
.client
.ui
.dist
.DistImages
;
31 import org
.argeo
.slc
.client
.ui
.dist
.DistPlugin
;
32 import org
.argeo
.slc
.client
.ui
.dist
.controllers
.ArtifactsTreeContentProvider
;
33 import org
.argeo
.slc
.repo
.RepoConstants
;
34 import org
.eclipse
.jface
.viewers
.ColumnLabelProvider
;
35 import org
.eclipse
.jface
.viewers
.ISelection
;
36 import org
.eclipse
.jface
.viewers
.ISelectionChangedListener
;
37 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
38 import org
.eclipse
.jface
.viewers
.SelectionChangedEvent
;
39 import org
.eclipse
.jface
.viewers
.TreeViewer
;
40 import org
.eclipse
.jface
.viewers
.ViewerCell
;
41 import org
.eclipse
.swt
.SWT
;
42 import org
.eclipse
.swt
.graphics
.Image
;
43 import org
.eclipse
.swt
.layout
.FillLayout
;
44 import org
.eclipse
.swt
.widgets
.Composite
;
45 import org
.eclipse
.swt
.widgets
.Tree
;
46 import org
.eclipse
.swt
.widgets
.TreeColumn
;
47 import org
.eclipse
.ui
.part
.ViewPart
;
50 * Basic View to browse a maven based repository.
52 * By Default size of the various bundles is not computed but it can be
53 * activated the view command.
56 public class ArtifactsBrowser
extends ViewPart
implements DistConstants
,
58 // private final static Log log = LogFactory.getLog(ArtifactsBrowser.class);
59 public final static String ID
= DistPlugin
.PLUGIN_ID
+ ".artifactsBrowser";
61 /* DEPENDENCY INJECTION */
62 private Session jcrSession
;
65 private Node rootNode
;
68 private TreeViewer artifactTreeViewer
;
69 private boolean isSizeVisible
= false;
71 // To be able to configure columns easily
72 public static final int COLUMN_TREE
= 0;
73 public static final int COLUMN_DATE
= 1;
74 public static final int COLUMN_SIZE
= 2;
75 private static final int SIZE_COL_WIDTH
= 55;
78 public void createPartControl(Composite parent
) {
79 // Enable the different parts to fill the whole page when the tab is
81 parent
.setLayout(new FillLayout());
82 artifactTreeViewer
= createArtifactsTreeViewer(parent
);
84 // context menu : it is completely defined in the plugin.xml file.
85 // Nothing in the context menu for the time being
86 // MenuManager menuManager = new MenuManager();
88 // menuManager.createContextMenu(artifactTreeViewer.getTree());
89 // artifactTreeViewer.getTree().setMenu(menu);
90 // getSite().registerContextMenu(menuManager, artifactTreeViewer);
92 getSite().setSelectionProvider(artifactTreeViewer
);
93 // packagesViewer.setComparer(new NodeViewerComparer());
95 // Model initialisation
96 if (jcrSession
!= null) {
98 rootNode
= jcrSession
.getNode(DEFAULT_ARTIFACTS_BASE_PATH
);
99 artifactTreeViewer
.setInput(rootNode
);
100 } catch (RepositoryException e
) {
101 throw new SlcException("Cannot load base artifact nodes", e
);
106 protected TreeViewer
createArtifactsTreeViewer(Composite parent
) {
107 int style
= SWT
.BORDER
| SWT
.MULTI
| SWT
.FULL_SELECTION
;
108 Tree tree
= new Tree(parent
, style
);
109 createColumn(tree
, "Artifacts", SWT
.LEFT
, 300);
110 createColumn(tree
, "Date created", SWT
.LEFT
, 105);
111 createColumn(tree
, "Size", SWT
.RIGHT
, 0);
112 tree
.setLinesVisible(true);
113 tree
.setHeaderVisible(true);
115 TreeViewer viewer
= new TreeViewer(tree
);
117 viewer
.setContentProvider(new ArtifactsTreeContentProvider());
118 viewer
.setLabelProvider(new ArtifactLabelProvider());
119 viewer
.addSelectionChangedListener(new ArtifactTreeSelectionListener());
120 // viewer.addDoubleClickListener(new GenericDoubleClickListener());
121 viewer
.setInput(rootNode
);
126 private static TreeColumn
createColumn(Tree parent
, String name
, int style
,
128 TreeColumn result
= new TreeColumn(parent
, style
);
129 result
.setText(name
);
130 result
.setWidth(width
);
131 result
.setMoveable(true);
132 result
.setResizable(true);
136 protected TreeViewer
getArtifactTreeViewer() {
137 return artifactTreeViewer
;
141 public void setFocus() {
142 // TODO Auto-generated method stub
147 * Refresh the given element of the tree browser. If null is passed as a
148 * parameter, it refreshes the whole tree
150 public void refresh(Object element
) {
151 if (element
== null) {
152 artifactTreeViewer
.refresh(rootNode
);
154 artifactTreeViewer
.refresh(element
);
157 /** Returns wether size column is visible or not */
158 public boolean isSizeVisible() {
159 return isSizeVisible
;
162 /** Sets the visibility of the size column */
163 public void setSizeVisible(boolean visible
) {
164 if (isSizeVisible
== visible
)
165 return; // nothing has changed
167 isSizeVisible
= visible
;
170 artifactTreeViewer
.getTree().getColumn(COLUMN_SIZE
)
171 .setWidth(SIZE_COL_WIDTH
);
173 // we just hide the column, we don't refresh the whole tree.
174 artifactTreeViewer
.getTree().getColumn(COLUMN_SIZE
).setWidth(0);
178 private class ArtifactLabelProvider
extends ColumnLabelProvider
implements
179 DistConstants
, SlcTypes
{
180 private static final long serialVersionUID
= 7516705499556141806L;
183 protected DateFormat timeFormatter
= new SimpleDateFormat(
186 public void update(ViewerCell cell
) {
187 int colIndex
= cell
.getColumnIndex();
188 Object element
= cell
.getElement();
189 cell
.setText(getColumnText(element
, colIndex
));
191 if (element
instanceof Node
&& colIndex
== 0) {
192 Node node
= (Node
) element
;
194 if (node
.isNodeType(SLC_ARTIFACT_BASE
))
195 cell
.setImage(DistImages
.IMG_ARTIFACT_BASE
);
196 else if (node
.isNodeType(SLC_ARTIFACT_VERSION_BASE
))
197 cell
.setImage(DistImages
.IMG_ARTIFACT_VERSION_BASE
);
198 } catch (RepositoryException e
) {
205 public Image
getImage(Object element
) {
207 if (element
instanceof Node
) {
208 Node node
= (Node
) element
;
210 if (node
.isNodeType(SLC_ARTIFACT_BASE
)) {
211 return DistImages
.IMG_ARTIFACT_BASE
;
212 } else if (node
.isNodeType(SLC_ARTIFACT_VERSION_BASE
)) {
213 return DistImages
.IMG_ARTIFACT_VERSION_BASE
;
215 } catch (RepositoryException e
) {
222 public String
getColumnText(Object element
, int columnIndex
) {
224 if (element
instanceof Node
) {
225 Node node
= (Node
) element
;
226 switch (columnIndex
) {
228 return node
.getName();
231 long size
= JcrUtils
.getNodeApproxSize(node
) / 1024;
233 return size
/ 1024 + " MB";
239 if (node
.hasProperty(Property
.JCR_CREATED
))
240 return timeFormatter
.format(node
241 .getProperty(Property
.JCR_CREATED
)
242 .getDate().getTime());
247 } catch (RepositoryException re
) {
248 throw new SlcException(
249 "Unexepected error while getting property values", re
);
254 // private String formatValueAsString(Value value) {
255 // // TODO enhance this method
259 // if (value.getType() == PropertyType.BINARY)
260 // strValue = "<binary>";
261 // else if (value.getType() == PropertyType.DATE)
262 // strValue = timeFormatter.format(value.getDate().getTime());
264 // strValue = value.getString();
266 // } catch (RepositoryException e) {
267 // throw new SlcException(
268 // "unexpected error while formatting value", e);
273 private class ArtifactTreeSelectionListener
implements
274 ISelectionChangedListener
{
276 public void selectionChanged(SelectionChangedEvent event
) {
277 ISelection selection
= event
.getSelection();
278 if (selection
!= null && selection
instanceof IStructuredSelection
) {
279 IStructuredSelection iss
= (IStructuredSelection
) selection
;
280 if (iss
.size() == 1) {
281 artifactTreeViewer
.refresh(iss
.getFirstElement());
289 /* DEPENDENCY INJECTION */
290 public void setJcrSession(Session jcrSession
) {
291 this.jcrSession
= jcrSession
;