Java tutorial
/** * 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, Jgerstr. 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; } }