/** * 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.view.network.views; import java.util.ArrayList; import java.util.Observable; import java.util.Observer; import java.util.Vector; import org.bbaw.pdr.ae.common.AEConstants; import org.bbaw.pdr.ae.common.AEVIEWConstants; 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.common.interfaces.AEFilter; import org.bbaw.pdr.ae.control.core.PDRConfigProvider; import org.bbaw.pdr.ae.control.core.PDRObjectBuilder; import org.bbaw.pdr.ae.control.facade.Facade; import org.bbaw.pdr.ae.metamodel.PdrId; import org.bbaw.pdr.ae.model.Aspect; import org.bbaw.pdr.ae.model.PdrObject; import org.bbaw.pdr.ae.model.Person; import org.bbaw.pdr.ae.model.ReferenceMods; import org.bbaw.pdr.ae.model.Relation; import org.bbaw.pdr.ae.model.RelationStm; import org.bbaw.pdr.ae.model.view.OrderingHead; import org.bbaw.pdr.ae.view.control.PDRObjectsProvider; import org.bbaw.pdr.ae.view.control.PDROrdererFactory; import org.bbaw.pdr.ae.view.control.customSWTWidges.AspectPresentationTooltip; import org.bbaw.pdr.ae.view.control.filters.AspectExcludeObjectRelationsFilter; import org.bbaw.pdr.ae.view.control.filters.OnlyAspectDivergentMarkup; import org.bbaw.pdr.ae.view.control.filters.OnlyAspectsAboutReferenceFilter; import org.bbaw.pdr.ae.view.control.filters.OnlyAspectsBasedOnReferenceFilter; import org.bbaw.pdr.ae.view.control.filters.OnlyNewPDRObjectsFilter; import org.bbaw.pdr.ae.view.control.filters.OnlyUpdatedPDRObjectsFilter; import org.bbaw.pdr.ae.view.main.dialogs.FilterSelectionDialog; import org.bbaw.pdr.ae.view.network.internal.Activator; import org.bbaw.pdr.ae.view.network.internal.PersonAspectRelationContentProvider; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.commands.NotEnabledException; import org.eclipse.core.commands.NotHandledException; import org.eclipse.core.commands.common.NotDefinedException; import org.eclipse.core.runtime.ILog; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.OwnerDrawLabelProvider; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.TableEditor; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.handlers.IHandlerService; import org.eclipse.ui.part.ViewPart; /** * This ViewClass creates the CategoryView of the Aspects of the current Person. * it extends AbstractCatView. The List of Categories is still static and based * upon the List given in the properties file. CategoryView . * @author Christoph Plutte */ public class RelationTableView extends ViewPart implements Observer, ISelectionProvider { /** The concurring. */ private boolean _concurring = false; /** The additional. */ private boolean _additional = false; /** The year filter action. */ private Action _onlyAspectsWithDivergentMarkup, _openAspectsInNewTap, _openReferencesInNewTap, _onlyNewAspectsAction, _onlyUpdatedAspectsAction, _excludeObjectRelationsAction, _referenceFilterAction, _userFilterAction, _semanticFilterAction, _personFilterAction, _yearFilterAction; /** The aspect exlude object relations filter. */ private AEFilter _onlyAspectsDivergentMarkupFilter, _onlyNewAspectsFilter, _onlyUpdatedAspectsFilter, _aspectExludeObjectRelationsFilter; /** The root menu manager. */ private IMenuManager _rootMenuManager; /** The _main composite. */ private Composite _mainComposite; /** * id of category view. */ public static final String ID = "org.bbaw.pdr.ae.view.relationnetwork.views.RelationTableView"; //$NON-NLS-1$ /** __facade singleton instance. */ private Facade _facade = Facade.getInstanz(); /** The _current objects. */ private PdrObject[] _currentObjects; /** Logger. */ private static ILog iLogger = AEConstants.ILOGGER; /** Instance of shared image registry. */ private static ImageRegistry _imageReg = CommonActivator.getDefault().getImageRegistry(); /** The pdr objects _provider. */ private PDRObjectsProvider _pdrObjectsProvider = new PDRObjectsProvider(); /** The _orderer factory. */ private PDROrdererFactory _ordererFactory = new PDROrdererFactory(); /** The selection changed listeners. */ private ArrayList<ISelectionChangedListener> _selectionChangedListeners = new ArrayList<ISelectionChangedListener>(); /** The _current aspect. */ private Aspect _currentAspect; private Action _onlyAspectsBasedOnReference; private Action _onlyAspectsAboutReference; private OnlyAspectsBasedOnReferenceFilter _onlyAspectsBasedOnReferenceFilter; private OnlyAspectsAboutReferenceFilter _onlyAspectsAboutReferenceFilter; private TableViewer viewer; private PDRObjectBuilder _pdrObjectBuilder = new PDRObjectBuilder(); private Menu headerMenu; private Composite tableComposite; private int _maxRows; private Composite _parentComposite; private Label _warningLabel; /** * constructor. */ public RelationTableView() { } @Override public final void addSelectionChangedListener(final ISelectionChangedListener listener) { _selectionChangedListeners.add(listener); } /** * Creates the actions. */ private void createActions() { _onlyNewAspectsAction = new Action(NLMessages.getString("View_action_only_newAspects")) { @Override public void run() { updateFilter(_onlyNewAspectsAction); } }; _onlyNewAspectsAction.setChecked(false); _onlyNewAspectsAction.setEnabled(false); _onlyNewAspectsAction.setImageDescriptor(_imageReg.getDescriptor(IconsInternal.DECORATION_NEW)); _onlyUpdatedAspectsAction = new Action(NLMessages.getString("View_action_only_updated_aspects")) { @Override public void run() { updateFilter(_onlyUpdatedAspectsAction); } }; _onlyUpdatedAspectsAction.setChecked(false); _onlyUpdatedAspectsAction.setEnabled(false); _onlyUpdatedAspectsAction.setImageDescriptor(_imageReg.getDescriptor(IconsInternal.DECORATION_UPDATED)); _excludeObjectRelationsAction = new Action(NLMessages.getString("View_action_exclude_other_relations")) { @Override public void run() { updateFilter(_excludeObjectRelationsAction); } }; _excludeObjectRelationsAction.setChecked(false); _excludeObjectRelationsAction.setEnabled(false); _excludeObjectRelationsAction.setImageDescriptor(_imageReg.getDescriptor(IconsInternal.RELATION)); _onlyAspectsWithDivergentMarkup = new Action("Only Aspects with divergent Markup") { @Override public void run() { updateFilter(_onlyAspectsWithDivergentMarkup); } }; _onlyAspectsWithDivergentMarkup.setChecked(false); _onlyAspectsWithDivergentMarkup.setEnabled(false); _onlyAspectsWithDivergentMarkup.setImageDescriptor(_imageReg.getDescriptor(IconsInternal.MARKUP_QUESTION)); _onlyAspectsBasedOnReference = new Action("Only Aspects which are based on this Reference") { @Override public void run() { updateFilter(_onlyAspectsBasedOnReference); } }; _onlyAspectsBasedOnReference.setChecked(false); _onlyAspectsBasedOnReference.setEnabled(false); _onlyAspectsBasedOnReference.setImageDescriptor(_imageReg.getDescriptor(IconsInternal.REFERENCE)); _onlyAspectsAboutReference = new Action("Only Aspects which speak about this Reference") { @Override public void run() { updateFilter(_onlyAspectsAboutReference); } }; _onlyAspectsAboutReference.setChecked(false); _onlyAspectsAboutReference.setEnabled(false); _onlyAspectsAboutReference.setImageDescriptor(_imageReg.getDescriptor(IconsInternal.REFERENCE_ASPECTS)); _referenceFilterAction = new Action(NLMessages.getString("View_action_reference_filter")) { @Override public void run() { IWorkbench workbench = PlatformUI.getWorkbench(); Display display = workbench.getDisplay(); Shell shell = new Shell(display); FilterSelectionDialog dialog = new FilterSelectionDialog(shell, _pdrObjectsProvider, "reference"); //$NON-NLS-1$ dialog.open(); if (dialog.getReturnCode() == 0) { loadPdrObject(_facade.getCurrentTreeObjects()); } _referenceFilterAction.setChecked(_pdrObjectsProvider.hasReferenceFilter()); } }; _referenceFilterAction.setChecked(false); _referenceFilterAction.setEnabled(false); _referenceFilterAction.setImageDescriptor(_imageReg.getDescriptor(IconsInternal.REFERENCES)); _personFilterAction = new Action(NLMessages.getString("View_action_person_filter")) { @Override public void run() { IWorkbench workbench = PlatformUI.getWorkbench(); Display display = workbench.getDisplay(); Shell shell = new Shell(display); FilterSelectionDialog dialog = new FilterSelectionDialog(shell, _pdrObjectsProvider, "person"); //$NON-NLS-1$ dialog.open(); if (dialog.getReturnCode() == 0) { loadPdrObject(_facade.getCurrentTreeObjects()); } _personFilterAction.setChecked(_pdrObjectsProvider.hasPersonFilter()); } }; _personFilterAction.setChecked(false); _personFilterAction.setEnabled(false); _personFilterAction.setImageDescriptor(_imageReg.getDescriptor(IconsInternal.PERSONS)); _semanticFilterAction = new Action(NLMessages.getString("View_action_semantic_filter")) { @Override public void run() { IWorkbench workbench = PlatformUI.getWorkbench(); Display display = workbench.getDisplay(); Shell shell = new Shell(display); FilterSelectionDialog dialog = new FilterSelectionDialog(shell, _pdrObjectsProvider, "semantic"); //$NON-NLS-1$ dialog.open(); if (dialog.getReturnCode() == 0) { loadPdrObject(_facade.getCurrentTreeObjects()); } _semanticFilterAction.setChecked(_pdrObjectsProvider.hasSemanticFilter()); } }; _semanticFilterAction.setChecked(false); _semanticFilterAction.setEnabled(false); _semanticFilterAction.setImageDescriptor(_imageReg.getDescriptor(IconsInternal.CLASSIFICATIONS)); _yearFilterAction = new Action(NLMessages.getString("View_action_time_filter")) { @Override public void run() { IWorkbench workbench = PlatformUI.getWorkbench(); Display display = workbench.getDisplay(); Shell shell = new Shell(display); FilterSelectionDialog dialog = new FilterSelectionDialog(shell, _pdrObjectsProvider, "year"); //$NON-NLS-1$ dialog.open(); if (dialog.getReturnCode() == 0) { loadPdrObject(_facade.getCurrentTreeObjects()); } _yearFilterAction.setChecked(_pdrObjectsProvider.hasYearFilter()); } }; _yearFilterAction.setChecked(false); _yearFilterAction.setEnabled(false); _yearFilterAction.setImageDescriptor(_imageReg.getDescriptor(IconsInternal.TIME)); _userFilterAction = new Action(NLMessages.getString("View_action_user_filter")) { @Override public void run() { IWorkbench workbench = PlatformUI.getWorkbench(); Display display = workbench.getDisplay(); Shell shell = new Shell(display); FilterSelectionDialog dialog = new FilterSelectionDialog(shell, _pdrObjectsProvider, "user"); //$NON-NLS-1$ dialog.open(); if (dialog.getReturnCode() == 0) { loadPdrObject(_facade.getCurrentTreeObjects()); } _userFilterAction.setChecked(_pdrObjectsProvider.hasUserFilter()); } }; _userFilterAction.setChecked(false); _userFilterAction.setEnabled(false); _userFilterAction.setImageDescriptor(_imageReg.getDescriptor(IconsInternal.USER)); } /** * Creates the additional aspects selection adapter. */ private void createAdditionalAspectsSelectionAdapter() { new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent ev) { // System.out.println("Selection: " + ev.text); //$NON-NLS-1$ Link button = (Link) ev.getSource(); Event event = new Event(); event.data = button.getData(); IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench().getService( IHandlerService.class); try { handlerService .executeCommand("org.bbaw.pdr.ae.view.main.commands.OpenAdditionalAspectsView", event); //$NON-NLS-1$ } catch (ExecutionException e) { e.printStackTrace(); } catch (NotDefinedException e) { e.printStackTrace(); } catch (NotEnabledException e) { e.printStackTrace(); } catch (NotHandledException e) { e.printStackTrace(); } } }; } /** * Creates the context menu. * @param control the control */ protected final void createContextMenu(final Control control) { /* Context Menu */ // Menu contextMenu = new Menu(stext); MenuManager menuMgr = new MenuManager(); Menu contextMenu = menuMgr.createContextMenu(control); SelectionAdapter contextMenuSelectionListener = new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent event) { MenuItem source = (MenuItem) event.getSource(); if ("".equals(source.getText())) //$NON-NLS-1$ { _facade.setCurrentCopiedAspect(); } } }; menuMgr.add(_openAspectsInNewTap); menuMgr.add(_openReferencesInNewTap); menuMgr.add(new Separator()); MenuItem menuOpenAspects = new MenuItem(contextMenu, SWT.PUSH); menuOpenAspects.setText(""); //$NON-NLS-1$ menuOpenAspects.addSelectionListener(contextMenuSelectionListener); MenuItem menuItemCopyAspect = new MenuItem(contextMenu, SWT.PUSH); menuItemCopyAspect.setText(""); //$NON-NLS-1$ menuItemCopyAspect.addSelectionListener(contextMenuSelectionListener); MenuItem menuItemCopyText = new MenuItem(contextMenu, SWT.PUSH); menuItemCopyText.setText(NLMessages.getString("View_copyText")); //$NON-NLS-1$ menuItemCopyText.addSelectionListener(contextMenuSelectionListener); control.setMenu(contextMenu); getSite().registerContextMenu(menuMgr, RelationTableView.this); } /** * Creates the context menu action. */ private void createContextMenuAction() { _openAspectsInNewTap = new Action(NLMessages.getString("View_action_open_aspects_new_tab")) { @Override public void run() { Aspect a = _facade.getCurrentAspect(); if (a != null && a.getPdrId() != null) { Event event = new Event(); event.data = a.getPdrId().toString(); IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench().getService( IHandlerService.class); try { handlerService.executeCommand( "org.bbaw.pdr.ae.view.main.commands.OpenAdditionalAspectsView", event); //$NON-NLS-1$ } catch (ExecutionException e) { e.printStackTrace(); } catch (NotDefinedException e) { e.printStackTrace(); } catch (NotEnabledException e) { e.printStackTrace(); } catch (NotHandledException e) { e.printStackTrace(); } } _openAspectsInNewTap.setChecked(false); } }; _openAspectsInNewTap.setChecked(false); _openAspectsInNewTap.setImageDescriptor(_imageReg.getDescriptor(IconsInternal.ASPECTS)); _openReferencesInNewTap = new Action(NLMessages.getString("View_action_open_references_new_tab")) { @Override public void run() { Aspect a = _facade.getCurrentAspect(); if (a != null && a.getPdrId() != null) { Event event = new Event(); event.data = a.getPdrId().toString(); IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench().getService( IHandlerService.class); try { handlerService.executeCommand( "org.bbaw.pdr.ae.view.main.commands.OpenAdditionalReferencesView", event); //$NON-NLS-1$ } catch (ExecutionException e) { e.printStackTrace(); } catch (NotDefinedException e) { e.printStackTrace(); } catch (NotEnabledException e) { e.printStackTrace(); } catch (NotHandledException e) { e.printStackTrace(); } } _openReferencesInNewTap.setChecked(false); } }; _openReferencesInNewTap.setChecked(false); _openReferencesInNewTap.setImageDescriptor(_imageReg.getDescriptor(IconsInternal.REFERENCES)); } /** * Creates the filters. */ private void createFilters() { // COMEBACK createFiltersAndSorters _onlyNewAspectsFilter = new OnlyNewPDRObjectsFilter(); _onlyUpdatedAspectsFilter = new OnlyUpdatedPDRObjectsFilter(); _onlyAspectsDivergentMarkupFilter = new OnlyAspectDivergentMarkup(); _aspectExludeObjectRelationsFilter = new AspectExcludeObjectRelationsFilter(null); _onlyAspectsBasedOnReferenceFilter = new OnlyAspectsBasedOnReferenceFilter(null); _onlyAspectsAboutReferenceFilter = new OnlyAspectsAboutReferenceFilter(null); } /** * Creates the menus. */ private void createMenus() { _rootMenuManager = getViewSite().getActionBars().getMenuManager(); _rootMenuManager.setRemoveAllWhenShown(true); _rootMenuManager.addMenuListener(new IMenuListener() { @Override public void menuAboutToShow(final IMenuManager mgr) { fillMenu(mgr); } }); fillMenu(_rootMenuManager); getViewSite().getActionBars().getToolBarManager().removeAll(); getViewSite().getActionBars().getToolBarManager().add(_onlyNewAspectsAction); getViewSite().getActionBars().getToolBarManager().add(_personFilterAction); getViewSite().getActionBars().getToolBarManager().add(_referenceFilterAction); getViewSite().getActionBars().getToolBarManager().add(_semanticFilterAction); getViewSite().getActionBars().getToolBarManager().add(_yearFilterAction); if (_currentObjects != null && _currentObjects.length > 0 && _currentObjects[0] instanceof ReferenceMods) { getViewSite().getActionBars().getToolBarManager().add(_onlyAspectsBasedOnReference); getViewSite().getActionBars().getToolBarManager().add(_onlyAspectsAboutReference); } getViewSite().getActionBars().updateActionBars(); } @Override public final void createPartControl(final Composite parent) { _parentComposite = parent; _parentComposite.setLayout(new GridLayout()); String secId = this.getViewSite().getSecondaryId(); if (secId != null) { _concurring = (secId.equals("b")); //$NON-NLS-1$ } Platform .getPreferencesService() .getString(CommonActivator.PLUGIN_ID, "PRIMARY_SEMANTIC_PROVIDER", AEConstants.CLASSIFICATION_AUTHORITY, null).toUpperCase(); _mainComposite = new Composite(parent, SWT.BORDER); _mainComposite.setLayoutData(new GridData()); ((GridData) _mainComposite.getLayoutData()).horizontalAlignment = SWT.FILL; ((GridData) _mainComposite.getLayoutData()).verticalAlignment = SWT.FILL; ((GridData) _mainComposite.getLayoutData()).grabExcessHorizontalSpace = true; ((GridData) _mainComposite.getLayoutData()).grabExcessVerticalSpace = true; _mainComposite.setLayout(new GridLayout()); _pdrObjectsProvider.setOrderer(_ordererFactory.createAspectOrderer("aspect.semantic")); createFilters(); createActions(); createContextMenuAction(); createAdditionalAspectsSelectionAdapter(); createMenus(); if (secId != null) { if (secId.startsWith("pdrPo")) //$NON-NLS-1$ { Person p = _facade.getPerson(new PdrId(secId)); if (p != null) { loadPdrObject(new Person[] {p}); setPartName(p.getDisplayName()); } _additional = true; } else if (secId.startsWith("pdrRo")) //$NON-NLS-1$ { ReferenceMods r = _facade.getReference(new PdrId(secId)); _additional = true; if (r != null) { loadPdrObject(new ReferenceMods[] {r}); setPartName(r.getDisplayName()); } } else if (secId.startsWith("pdrAo")) //$NON-NLS-1$ { Aspect a = _facade.getLoadedAspects().get(secId); _additional = true; if (a != null) { loadPdrObject(new Aspect[] {a}); setPartName(a.getDisplayName()); } } else if (secId.startsWith("a") || secId.startsWith("b")) //$NON-NLS-1$ //$NON-NLS-2$ { } } else { } getSite().setSelectionProvider(RelationTableView.this); // parent.layout(); // parent.pack(); _facade.addObserver(this); update(null, "newTreeObjects"); } /** * Fill menu. * @param rootMenuManager the root menu manager */ private void fillMenu(final IMenuManager rootMenuManager) { rootMenuManager.removeAll(); rootMenuManager.add(_onlyNewAspectsAction); rootMenuManager.add(_onlyUpdatedAspectsAction); rootMenuManager.add(_onlyAspectsWithDivergentMarkup); rootMenuManager.add(_excludeObjectRelationsAction); rootMenuManager.add(_referenceFilterAction); rootMenuManager.add(_personFilterAction); rootMenuManager.add(_semanticFilterAction); rootMenuManager.add(_yearFilterAction); rootMenuManager.add(_userFilterAction); if (_currentObjects != null && _currentObjects.length > 0 && _currentObjects[0] instanceof ReferenceMods) { rootMenuManager.add(_onlyAspectsBasedOnReference); rootMenuManager.add(_onlyAspectsAboutReference); } } @Override public final ISelection getSelection() { StructuredSelection selection; if (_currentAspect != null) { selection = new StructuredSelection(new PdrObject[] {_currentAspect}); } else { selection = new StructuredSelection(new PdrObject[] {}); } return selection; } private void createViewer(Composite parent, Vector<OrderingHead> arrangedAspects, String[] columntitles) { // Define the TableViewer viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER); // Create the columns createColumns(parent, columntitles); // Make lines and make header visible final Table table = viewer.getTable(); table.setHeaderVisible(true); table.setLinesVisible(true); // Set the ContentProvider viewer.setContentProvider(new PersonAspectRelationContentProvider()); viewer.setLabelProvider(new OwnerDrawLabelProvider() { @Override protected void measure(Event event, Object element) { event.height = 26 + 18 * _maxRows; } @Override protected void paint(Event event, Object element) { Image img = null; if (event.index == 0) { img = _imageReg.get(IconsInternal.PERSON); Rectangle bounds = ((TableItem) event.item).getBounds(event.index); Rectangle imgBounds = img.getBounds(); bounds.height /= 2; bounds.height -= imgBounds.height / 2; int y = bounds.height > 0 ? bounds.y + bounds.height : bounds.y; event.gc.drawImage(img, 0, y); event.gc.drawText(getFirstColumnText(element, event.index), imgBounds.width + 2, y, true); } else { } } public String getFirstColumnText(Object element, int columnIndex) { if (element instanceof String) { return ((String) element); } else if (element instanceof Object[]) { if (columnIndex == 0) { return ((String) ((Object[]) element)[0]); } } return null; } }); // Get the content for the Viewer, // setInput will call getElements in the ContentProvider if (arrangedAspects != null) viewer.setInput(arrangedAspects); TableItem[] items = table.getItems(); TableItem item; SelectionListener selectionListener = new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { Control l = (Control) e.widget; PdrId id = (PdrId) l.getData("id"); PdrId subj; PdrId obj; Aspect a; if (id != null) { a = _facade.getAspect(id); } else { subj = (PdrId) l.getData("sub"); obj = (PdrId) l.getData("obj"); if (_facade.getLastAspects() != null && !_facade.getLastAspects().isEmpty()) { a = _pdrObjectBuilder.buildSimilarAspect(subj, obj, _facade.getLastAspects().lastElement()); } else { a = _pdrObjectBuilder.buildSimilarAspect(subj, obj, null); } } _facade.setCurrentAspect(a); IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench().getService( IHandlerService.class); try { handlerService.executeCommand("org.bbaw.pdr.ae.view.main.commands.CallAspectEditor", new Event()); //$NON-NLS-1$ } catch (ExecutionException ex) { ex.printStackTrace(); } catch (NotDefinedException ex) { ex.printStackTrace(); } catch (NotEnabledException ex) { ex.printStackTrace(); } catch (NotHandledException ex) { ex.printStackTrace(); } } }; Relation relation; for (int i = 0; i < items.length; i++) { TableEditor editor = new TableEditor(table); GridLayout gl = new GridLayout(2, false); gl.marginHeight = 0; gl.marginWidth = 0; PdrId subject = new PdrId(arrangedAspects.get(i).getValue()); item = items[i]; int rows = 0; if (item.getData() != null) { Object[] objs = (Object[]) item.getData(); if (objs.length > 1) { for (int j = 1; j < objs.length; j++) { Object o = objs[j]; PdrId objectId = new PdrId(arrangedAspects.get(j - 1).getValue()); boolean empty = true; editor = new TableEditor(table); Composite composite = new Composite(table, SWT.NONE); // composite.setText("Text"); composite.setLayout(gl); composite.setBackground(AEVIEWConstants.VIEW_BACKGROUND_DESELECTED_COLOR); editor.grabHorizontal = true; if (o != null && o instanceof Vector<?>) { Vector<Aspect> aspects = (Vector<Aspect>) o; if (!aspects.isEmpty()) { RelationStm relationSm; String relationString = null; for (Aspect a : aspects) { rows = 0; if (a.getRelationDim() != null && !a.getRelationDim().getRelationStms().isEmpty()) { for (int k = 0; k < a.getRelationDim().getRelationStms().size(); k++) { relationSm = a.getRelationDim().getRelationStms().get(k); if (relationSm.getSubject() != null && relationSm.getSubject().equals(subject) && relationSm.getRelations() != null && !relationSm.getRelations().isEmpty()) { for (int l = 0; l < relationSm.getRelations().size(); l++) { relation = relationSm.getRelations().get(l); if (relation.getObject().equals(objectId) && relation.getContext() != null) { empty = false; rows++; relationString = PDRConfigProvider.getLabelOfRelation( relation.getProvider(), relation.getContext(), relation.getRClass(), relation.getRelation()); Label label = new Label(composite, SWT.NONE); label.setImage(_imageReg.get(IconsInternal.RELATION)); label.setBackground(AEVIEWConstants.VIEW_BACKGROUND_DESELECTED_COLOR); Link link = new Link(composite, SWT.None); link.setText("<a>" + relationString + ": " + a.getDisplayNameWithID() + "</a>"); link.setBackground(AEVIEWConstants.VIEW_BACKGROUND_DESELECTED_COLOR); link.setData("id", a.getPdrId()); final AspectPresentationTooltip aspectTooltip = new AspectPresentationTooltip( link, a); aspectTooltip.setPopupDelay(1); aspectTooltip.setHideDelay(0); aspectTooltip.setHideOnMouseDown(false); aspectTooltip.activate(); link.addSelectionListener(selectionListener); link.pack(); } } } } } if (rows > _maxRows) { _maxRows = rows; } } } } if (arrangedAspects.size() < 12 && empty && i != j - 1) { Button newAspect = new Button(composite, SWT.PUSH); newAspect.setImage(_imageReg.get(IconsInternal.ASPECT_ADD_SAME_PERSON)); newAspect.setBackground(AEVIEWConstants.VIEW_BACKGROUND_DESELECTED_COLOR); newAspect.setData("sub", subject.clone()); newAspect.setData("obj", objectId.clone()); newAspect.addSelectionListener(selectionListener); newAspect.pack(); } composite.pack(); composite.layout(); editor.setEditor(composite, items[i], j); editor.minimumHeight = 20; } } } } // // Make the selection available to other Views getSite().setSelectionProvider(viewer); // Layout the viewer GridData gridData = new GridData(); gridData.verticalAlignment = GridData.FILL; gridData.horizontalSpan = 2; gridData.grabExcessHorizontalSpace = true; gridData.grabExcessVerticalSpace = true; gridData.horizontalAlignment = GridData.FILL; viewer.getControl().setLayoutData(gridData); // Set the sorter for the table // viewer.setComparator(comparator); } // Used to update the viewer from outsite public void refresh() { viewer.refresh(); } // This will create the columns for the table private void createColumns(final Composite parent, String[] columntitles) { headerMenu = new Menu(parent.getShell(), SWT.POP_UP); // First column is for the first name for (int i = 0; i < columntitles.length; i++) { TableViewerColumn col = createTableViewerColumn(columntitles[i], 130, i); } } private void createMenuItem(Menu parent, final TableColumn column) { final MenuItem itemName = new MenuItem(parent, SWT.CHECK); itemName.setText(column.getText()); itemName.setSelection(column.getResizable()); itemName.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { if (itemName.getSelection()) { column.setWidth(150); column.setResizable(true); } else { column.setWidth(0); column.setResizable(false); } } }); } private TableViewerColumn createTableViewerColumn(String title, int bound, final int colNumber) { final TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE); final TableColumn column = viewerColumn.getColumn(); column.setText(title); column.setWidth(bound); column.setResizable(true); column.setMoveable(false); if (colNumber > 0) { column.setImage(_imageReg.get(IconsInternal.PERSON)); } // column.addSelectionListener(getSelectionAdapter(column, colNumber)); // Create the menu item for this column createMenuItem(headerMenu, column); return viewerColumn; } /** * Passing the focus request to the viewer's control. */ public void setFocus() { if (viewer != null) viewer.getControl().setFocus(); } private void loadPdrObject(PdrObject[] selectedTreeObjects) { // _pdrObjectsProvider.removeAllFilters(); PdrObject[] currentTreeObjects = null; if (selectedTreeObjects.length > 40) { currentTreeObjects = new PdrObject[40]; for (int i = 0; i < 40; i++) { currentTreeObjects[i] = selectedTreeObjects[i]; } } else { currentTreeObjects = selectedTreeObjects; } if (currentTreeObjects != null) { _maxRows = 0; _onlyNewAspectsAction.setChecked(false); _onlyUpdatedAspectsAction.setChecked(false); _excludeObjectRelationsAction.setChecked(false); _referenceFilterAction.setChecked(false); _userFilterAction.setChecked(false); _semanticFilterAction.setChecked(false); _personFilterAction.setChecked(false); _yearFilterAction.setChecked(false); _onlyNewAspectsAction.setEnabled(true); _onlyUpdatedAspectsAction.setEnabled(true); _onlyAspectsWithDivergentMarkup.setEnabled(true); _excludeObjectRelationsAction.setEnabled(true); _referenceFilterAction.setEnabled(true); _userFilterAction.setEnabled(true); _semanticFilterAction.setEnabled(true); _personFilterAction.setEnabled(true); _yearFilterAction.setEnabled(true); _pdrObjectsProvider.setInput(currentTreeObjects); _pdrObjectsProvider.setOrderer(_ordererFactory.createAspectOrderer("aspect.person")); Vector<OrderingHead> arrangedAspects = _pdrObjectsProvider.getArrangedAspects(); String[] columntitles = new String[arrangedAspects.size() + 1]; for (int i = 0; i <= arrangedAspects.size(); i++) { if (i == 0) { columntitles[0] = NLMessages.getString("Editor_subject") + " \\ " + NLMessages.getString("Editor_object"); } else { OrderingHead oh = arrangedAspects.get(i - 1); columntitles[i] = oh.getLabel(); } } if (tableComposite != null) { tableComposite.dispose(); tableComposite = null; } if (selectedTreeObjects.length > 40) { if (_warningLabel == null) { _warningLabel = new Label(_mainComposite, SWT.NONE); _warningLabel .setText("More then 40 Persons selected - but this TableView can present only 40. Some Persons are not presented."); _warningLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1)); _warningLabel.pack(); } } else if (_warningLabel != null) { _warningLabel.dispose(); _warningLabel = null; } tableComposite = new Composite(_mainComposite, SWT.NONE); tableComposite.setLayout(new GridLayout(2, false)); tableComposite.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL, GridData.HORIZONTAL_ALIGN_FILL, true, true, 2, 0)); ((GridData) tableComposite.getLayoutData()).grabExcessHorizontalSpace = true; ((GridData) tableComposite.getLayoutData()).grabExcessVerticalSpace = true; ((GridData) tableComposite.getLayoutData()).horizontalAlignment = SWT.FILL; ((GridData) tableComposite.getLayoutData()).verticalAlignment = SWT.FILL; createViewer(tableComposite, arrangedAspects, columntitles); viewer.getTable().setLayoutData( new GridData(GridData.GRAB_HORIZONTAL, GridData.HORIZONTAL_ALIGN_FILL, true, true, 2, 0)); ((GridData) viewer.getTable().getLayoutData()).grabExcessHorizontalSpace = true; ((GridData) viewer.getTable().getLayoutData()).grabExcessVerticalSpace = true; ((GridData) viewer.getTable().getLayoutData()).horizontalAlignment = SWT.FILL; ((GridData) viewer.getTable().getLayoutData()).verticalAlignment = SWT.FILL; _mainComposite.pack(); _parentComposite.redraw(); _parentComposite.update(); _parentComposite.layout(); } } @Override public void dispose() { _facade.deleteObserver(RelationTableView.this); super.dispose(); } @Override public final void removeSelectionChangedListener(final ISelectionChangedListener listener) { _selectionChangedListeners.remove(listener); } /** * registers changed selection. * @param part workbench part * @param selection new selection */ public void selectionChanged(final IWorkbenchPart part, final ISelection selection) { } @Override public final void setSelection(final ISelection arg0) { // TODO Auto-generated method stub } @Override public final void update(final Observable o, final Object arg) { IStatus supdate = new Status(IStatus.INFO, Activator.PLUGIN_ID, "RelationTableView update: " + arg); //$NON-NLS-1$ iLogger.log(supdate); _pdrObjectsProvider.removeAllFilters(); if (!_concurring && !_additional) { if (_facade.getCurrentTreeObjects() != null) { } if (arg.equals("newTreeObjects")) //$NON-NLS-1$ //$NON-NLS-2$ { loadPdrObject(_facade.getCurrentTreeObjects()); } else if (arg.equals("newNewAspect")) //$NON-NLS-1$ //$NON-NLS-2$ { loadPdrObject(_facade.getCurrentTreeObjects()); } else if (arg.equals("refreshAll")) //$NON-NLS-1$ { } } else if (!_additional) { if (_facade.getConcurringPerson() != null) { } if (arg.equals("newConcurringPerson")) //$NON-NLS-1$ //$NON-NLS-2$ { loadPdrObject(new Person[] {_facade.getConcurringPerson()}); } else if (arg.equals("newNewAspect")) //$NON-NLS-1$ //$NON-NLS-2$ { loadPdrObject(new Person[] {_facade.getConcurringPerson()}); } else if (arg.equals("noSelectedConcurringPerson")) //$NON-NLS-1$ { } } } /** * Update filter. * @param action the action */ private void updateFilter(final Action action) { if (action == _onlyNewAspectsAction) { if (action.isChecked()) { _pdrObjectsProvider.addFilter(_onlyNewAspectsFilter); } else { _pdrObjectsProvider.removeFilter(_onlyNewAspectsFilter); } } else if (action == _onlyUpdatedAspectsAction) { if (action.isChecked()) { _pdrObjectsProvider.addFilter(_onlyUpdatedAspectsFilter); } else { _pdrObjectsProvider.removeFilter(_onlyUpdatedAspectsFilter); } } else if (action == _onlyAspectsWithDivergentMarkup) { if (action.isChecked()) { _pdrObjectsProvider.addFilter(_onlyAspectsDivergentMarkupFilter); } else { _pdrObjectsProvider.removeFilter(_onlyAspectsDivergentMarkupFilter); } } else if (action == _excludeObjectRelationsAction) { if (action.isChecked()) { Vector<String> ids = new Vector<String>(_facade.getCurrentTreeObjects().length); for (int i = 0; i < _facade.getCurrentTreeObjects().length; i++) { ids.add(_facade.getCurrentTreeObjects()[i].getPdrId().toString()); } ((AspectExcludeObjectRelationsFilter) _aspectExludeObjectRelationsFilter).setPersonIds(ids); _pdrObjectsProvider.addFilter(_aspectExludeObjectRelationsFilter); } else { _pdrObjectsProvider.removeFilter(_aspectExludeObjectRelationsFilter); } } else if (action == _onlyAspectsAboutReference) { if (action.isChecked()) { Vector<String> ids = new Vector<String>(_facade.getCurrentTreeObjects().length); for (int i = 0; i < _facade.getCurrentTreeObjects().length; i++) { ids.add(_facade.getCurrentTreeObjects()[i].getPdrId().toString()); } ((OnlyAspectsAboutReferenceFilter) _onlyAspectsAboutReferenceFilter).setObjectIds(ids); _pdrObjectsProvider.addFilter(_onlyAspectsAboutReferenceFilter); } else { _pdrObjectsProvider.removeFilter(_onlyAspectsAboutReferenceFilter); } } else if (action == _onlyAspectsBasedOnReference) { if (action.isChecked()) { Vector<String> ids = new Vector<String>(_facade.getCurrentTreeObjects().length); for (int i = 0; i < _facade.getCurrentTreeObjects().length; i++) { ids.add(_facade.getCurrentTreeObjects()[i].getPdrId().toString()); } ((OnlyAspectsBasedOnReferenceFilter) _onlyAspectsBasedOnReferenceFilter).setObjectIds(ids); _pdrObjectsProvider.addFilter(_onlyAspectsBasedOnReferenceFilter); } else { _pdrObjectsProvider.removeFilter(_onlyAspectsBasedOnReferenceFilter); } } loadPdrObject(_facade.getCurrentTreeObjects()); } }