/** * This file is part of Archiv-Editor. * * The software Archiv-Editor serves as a client user interface for working with * the Person Data Repository. See: pdr.bbaw.de * * The software Archiv-Editor was developed at the Berlin-Brandenburg Academy * of Sciences and Humanities, Jägerstr. 22/23, D-10117 Berlin. * www.bbaw.de * * Copyright (C) 2010-2013 Berlin-Brandenburg Academy * of Sciences and Humanities * * The software Archiv-Editor was developed by @author: Christoph Plutte. * * Archiv-Editor is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Archiv-Editor is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Archiv-Editor. * If not, see <http://www.gnu.org/licenses/lgpl-3.0.html>. */ package org.bbaw.pdr.ae.export.swt.preview; import java.text.DateFormat; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.Map.Entry; import java.util.Vector; import org.bbaw.pdr.ae.common.CommonActivator; import org.bbaw.pdr.ae.common.NLMessages; import org.bbaw.pdr.ae.common.icons.IconsInternal; import org.bbaw.pdr.ae.export.logic.StructNode; import org.bbaw.pdr.ae.metamodel.Revision; import org.bbaw.pdr.ae.model.Aspect; import org.bbaw.pdr.ae.model.Person; import org.bbaw.pdr.ae.model.ReferenceMods; import org.bbaw.pdr.ae.model.SemanticStm; import org.bbaw.pdr.ae.model.Time; import org.bbaw.pdr.ae.model.TimeStm; import org.bbaw.pdr.ae.model.ValidationStm; import org.eclipse.jface.layout.TreeColumnLayout; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.TreeViewerColumn; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; public class PdrSelectionPreviewColumns { static ImageRegistry imgReg = CommonActivator.getDefault().getImageRegistry(); final static HashMap<String, Image> icons = new HashMap<String, Image>(); static { icons.put("semantic", imgReg.get(IconsInternal.CLASSIFICATION)); icons.put("reference", imgReg.get(IconsInternal.REFERENCES)); icons.put("person", imgReg.get(IconsInternal.PERSON)); icons.put("year", imgReg.get(IconsInternal.TIME)); icons.put("place", imgReg.get(IconsInternal.PLACE)); icons.put("relation", imgReg.get(IconsInternal.RELATION)); icons.put("user", imgReg.get(IconsInternal.USER)); icons.put("markup", imgReg.get(IconsInternal.MARKUP)); } // ########## Column Label Providers ########### /** * Label provider for first column of PDR objects preview, displaying PDR objects selection. * @author jakobh */ private class PdrObjectsLblProv extends ColumnLabelProvider { @Override public String getText(Object element) { StructNode node = (StructNode)element; return node.getLabel(); } @Override public Image getImage(Object element) { StructNode node = ((StructNode)element); if (node.getType().startsWith("pdr")) { if (node.getContent() instanceof Person) return imgReg.get(IconsInternal.PERSON); else if (node.getContent() instanceof Aspect) { if (node.getType().endsWith("normname")) return imgReg.get(IconsInternal.CLASSIFICATION_NAME_NORM); return imgReg.get(IconsInternal.ASPECT); } else if (node.getContent() instanceof ReferenceMods) return imgReg.get(IconsInternal.REFERENCE); } else if (node.getType().startsWith("grouped.")){ for (Entry<String, Image> icnd : icons.entrySet()) if (node.getType().contains(icnd.getKey())) return icnd.getValue(); } return null; } /*public Image getColumnImage(Object element, int index) { return getImage(element); }*/ @Override public void update(ViewerCell cell) { super.update(cell); } } /** * Label Provider for temporal information in PDR objects. * @author jakobh */ private class ChronoLblProv extends ColumnLabelProvider { @Override public String getText(Object element) { StructNode node = (StructNode)element; if (node.getContent() instanceof Aspect) { if (((Aspect)node.getContent()).getTimeDim().isValid()) { Vector<TimeStm> stms = ((Aspect)node.getContent()).getTimeDim().getTimeStms(); if (stms.size()>0) { Vector<Integer> years = new Vector<Integer>(); for (TimeStm stm : stms) { Vector<Time> times = stm.getTimes(); for (Time t : times) years.add(t.getTimeStamp().getYear()); } if (years.size()>0){ Collections.sort(years); if (years.lastElement()>years.firstElement()) return years.firstElement()+"-"+years.lastElement(); return ""+years.firstElement(); } } } } return ""; } } /** * Label Provider for PDR repo categories ({@link SemanticStm}). * @author jakobh */ private class CategoryLblProv extends ColumnLabelProvider { @Override public String getText(Object element) { StructNode node = (StructNode)element; if (node.getContent() instanceof Aspect){ String categories = ""; for (SemanticStm stm : ((Aspect)node.getContent()).getSemanticDim().getSemanticStms()) categories+=" "+stm.getLabel(); return categories; } return ""; } } /** * Label Provider for time of latest changes column. * @author jakobh */ private class RecentChgLblProv extends ColumnLabelProvider { private Date time; private DateFormat df; public RecentChgLblProv(){ super(); time = new Date(); df = DateFormat.getDateInstance(); } @Override public String getText(Object element) { StructNode node = (StructNode)element; if (node.getContent() instanceof Aspect) { Vector<Revision> revisions = ((Aspect)node.getContent()).getRecord().getRevisions(); if (revisions.size()>0){ Vector<Date> timestamps = new Vector<Date>(); for (Revision rev : revisions) timestamps.add(rev.getTimeStamp()); Collections.sort(timestamps); long changed = (time.getTime()-timestamps.lastElement().getTime())/60000; if (changed < 60) { return changed+" min ago"; } else if (changed < 24*60) { return changed/60+" hours ago"; } else if (changed < 24*60*7) { return changed/24/60+" days ago"; } else if (changed < 24*60*4) { return changed/24/60/7+" weeks ago"; } return df.format(timestamps.lastElement()); } } return ""; } } /** * Label Provider for PDR object validating sources ({@link ValidationStm}). * @author jakobh */ private class ReferenceLblProv extends ColumnLabelProvider { @Override public String getText(Object element) { StructNode node = (StructNode)element; if (node.getContent() instanceof Aspect){ Vector<ValidationStm> sources = ((Aspect)node.getContent()).getValidation().getValidationStms(); for (ValidationStm src : sources){ //FIXME: macht keinen sinn return src.getReference().getInternal(); } } return ""; }; } /** * Label Provider for authoring user column. * @author jakobh */ private class CreatorLblProv extends ColumnLabelProvider { @Override public String getText(Object element) { StructNode node = (StructNode)element; if (node.getContent() instanceof Aspect){ Revision firstRev = ((Aspect)node.getContent()).getRecord().getRevisions().firstElement(); return firstRev.getRevisor(); } return ""; }; } private class ColumnSelectionListener extends SelectionAdapter { private int index; public ColumnSelectionListener(int i){ index = i; } @Override public void widgetSelected(SelectionEvent arg0) { columnSort = preview.sortBy(index); } } private TreeViewerColumn pdrObjectsCol; private TreeViewerColumn chronoCol; private TreeViewerColumn categoryCol; private TreeViewerColumn recentChgCol; private TreeViewerColumn referenceCol; private TreeViewerColumn creatorCol; private PdrSelectionFilterPreview preview; private int columnCount = 0; private int columnSort = 0; private static PdrSelectionPreviewColumns instance; public static PdrSelectionPreviewColumns createColumns(PdrSelectionFilterPreview preview, Composite parent) { instance = new PdrSelectionPreviewColumns(preview, parent); return instance; } private PdrSelectionPreviewColumns(PdrSelectionFilterPreview preview, Composite parent){ this.preview = preview; pdrObjectsCol = createColumn("", SWT.CENTER, true, false); chronoCol = createColumn(NLMessages.getString("View_sort_cronologically"), SWT.CENTER, true, true); categoryCol = createColumn(NLMessages.getString("View_sort_semantic"), SWT.CENTER, true, true); recentChgCol = createColumn(NLMessages.getString("View_sort_revision"), SWT.CENTER, true, true); referenceCol = createColumn(NLMessages.getString("View_sort_reference"), SWT.CENTER, true, true); creatorCol = createColumn(NLMessages.getString("View_sort_creator"), SWT.CENTER, true, true); pdrObjectsCol.setLabelProvider(new PdrObjectsLblProv()); chronoCol.setLabelProvider(new ChronoLblProv()); categoryCol.setLabelProvider(new CategoryLblProv()); recentChgCol.setLabelProvider(new RecentChgLblProv()); referenceCol.setLabelProvider(new ReferenceLblProv()); creatorCol.setLabelProvider(new CreatorLblProv()); TreeColumnLayout columnLayout = new TreeColumnLayout(); parent.setLayout(columnLayout); columnLayout.setColumnData(pdrObjectsCol.getColumn(), new ColumnWeightData(40)); columnLayout.setColumnData(chronoCol.getColumn(), new ColumnWeightData(10)); columnLayout.setColumnData(categoryCol.getColumn(), new ColumnWeightData(20)); columnLayout.setColumnData(recentChgCol.getColumn(), new ColumnWeightData(10)); columnLayout.setColumnData(referenceCol.getColumn(), new ColumnWeightData(15)); columnLayout.setColumnData(creatorCol.getColumn(), new ColumnWeightData(10)); } private TreeViewerColumn createColumn(String caption, int style, boolean resizable, boolean moveable){ TreeViewerColumn col = new TreeViewerColumn(preview, style, columnCount); col.getColumn().setText(caption); col.getColumn().setResizable(resizable); col.getColumn().setMoveable(moveable); // TODO: sortieren reparieren, listener wieder rein // col.getColumn().addSelectionListener(new ColumnSelectionListener(columnCount)); columnCount++; return col; } public static void setColumnLabel(String label) { instance.pdrObjectsCol.getColumn().setText(label); } /** * Returns the index number of the column that caused the most recent re-sorting of * the {@link PdrSelectionFilterPreview} content, for the sake of which this * {@link TreeViewerColumn} ensemble has been created, plus an indicator of the * contents being sorted in reverse order. Ids range from 0 to 5, with 8 being added * if reverse order has been applied. * @return */ public int getSortingColumn() { return instance.columnSort; } }