+++ /dev/null
-/**
- *
- */
-package eu.etaxonomy.taxeditor.navigation.key.polytomous;
-
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.common.NotDefinedException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.action.GroupMarker;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.part.ViewPart;
-
-import eu.etaxonomy.cdm.api.application.CdmApplicationState;
-import eu.etaxonomy.cdm.api.application.CdmChangeEvent;
-import eu.etaxonomy.cdm.api.application.CdmChangeEvent.Action;
-import eu.etaxonomy.cdm.api.application.ICdmChangeListener;
-import eu.etaxonomy.cdm.api.application.ICdmDataChangeService;
-import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
-import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
-import eu.etaxonomy.cdm.api.service.IPolytomousKeyService;
-import eu.etaxonomy.cdm.model.common.CdmBase;
-import eu.etaxonomy.cdm.model.description.PolytomousKey;
-import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
-import eu.etaxonomy.taxeditor.model.ContextListenerAdapter;
-import eu.etaxonomy.taxeditor.model.DataChangeBridge;
-import eu.etaxonomy.taxeditor.model.IContextListener;
-import eu.etaxonomy.taxeditor.model.MessagingUtils;
-import eu.etaxonomy.taxeditor.navigation.l10n.Messages;
-import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
-import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
-import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
-import eu.etaxonomy.taxeditor.store.CdmStore;
-import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
-
-/**
- * @author n.hoffmann
- *
- */
-public class PolytomousKeyViewPart extends ViewPart implements
- IConversationEnabled, ICdmEntitySessionEnabled, IPostOperationEnabled,
- ICdmChangeListener {
-
- private class FilterModifyListener implements ModifyListener{
- @Override
- public void modifyText(ModifyEvent e) {
- ViewerFilter filter = new ViewerFilter(){
-
- @Override
- public boolean select(Viewer viewer, Object parentElement,
- Object element) {
-
- if(element instanceof PolytomousKey){
- PolytomousKey key = (PolytomousKey) element;
- if(key.getTitleCache().contains(text_filter.getText())){
- return true;
- }
- }
-
- return false;
- }
-
- };
-
- viewer.setFilters(new ViewerFilter[]{filter});
- }
- }
-
-
- public static final String ID = "eu.etaxonomy.taxeditor.navigation.key.polytomous.polytomousKeyViewPart"; //$NON-NLS-1$
-
- public static final String OPEN_COMMAND_ID = "eu.etaxonomy.taxeditor.navigation.key.polytomous.editNodes"; //$NON-NLS-1$
-
- private class ContextListener extends ContextListenerAdapter{
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
- */
- @Override
- public void contextStop(IMemento memento, IProgressMonitor monitor) {
- monitor.subTask(Messages.PolytomousKeyViewPart_SHUTDOWN);
- if(!viewer.getControl().isDisposed()){
- viewer.setInput(null);
- }
- }
-
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.model.ContextListenerAdapter#contextStart(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
- */
- @Override
- public void contextStart(IMemento memento, IProgressMonitor monitor) {
- monitor.subTask(Messages.PolytomousKeyViewPart_INIT);
- setInput();
- }
- }
-
- private ListViewer viewer;
- private ConversationHolder conversation;
- private IContextListener contextListener;
- private CdmFormFactory formFactory;
- private Text text_filter;
- private ICdmEntitySession cdmEntitySession;
-
- private PolytomousKeyViewPartDataChangeBehavior dataChangeBehavior;
-
- public PolytomousKeyViewPart(){
-// formFactory = new CdmFormFactory(Display.getDefault());
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
- */
- @Override
- public void createPartControl(Composite parent) {
-
- Composite container = new Composite(parent, SWT.NONE);
- container.setLayout(new GridLayout());
-
- contextListener = new ContextListener();
- CdmStore.getContextManager().addContextListener(contextListener);
-
- text_filter = formFactory.createText(container, ""); //$NON-NLS-1$
- text_filter.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
- text_filter.addModifyListener(new FilterModifyListener());
-
- viewer = new ListViewer(container, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI);
- viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-
- viewer.setContentProvider(new PolytomousKeyContentProvider());
- viewer.setLabelProvider(new ColumnLabelProvider());
-
- viewer.addDoubleClickListener(new IDoubleClickListener() {
-
- @Override
- public void doubleClick(DoubleClickEvent event) {
- openSelectedKeyNodes();
- }
- });
-
-
- getSite().setSelectionProvider(viewer);
-
- createMenu();
-
- if(CdmStore.isActive()){
- setInput();
- }
- }
-
- public void openSelectedKeyNodes() {
- ICommandService commandService = getSite().getService(ICommandService.class);
-
- Command command = commandService.getCommand(OPEN_COMMAND_ID);
- if(command.isEnabled()) {
- IHandlerService handlerService = getSite().getService(IHandlerService.class);
- try {
- handlerService.executeCommand(OPEN_COMMAND_ID, null);
- } catch (NotDefinedException e) {
- throw new RuntimeException("Could not find open command: " + OPEN_COMMAND_ID); //$NON-NLS-1$
- } catch (Exception e) {
- MessagingUtils.error(getClass(), Messages.PolytomousKeyViewPart_EXCEPTION, e);
- }
- }
- }
-
- public void setViewerSelection(ISelection selection, boolean reveal) {
- getSite().setSelectionProvider(viewer);
- viewer.setSelection(selection,reveal);
- viewer.getList().notifyListeners(SWT.Selection,new Event());
- }
-
- private void createMenu(){
- MenuManager menuManager = new MenuManager();
- menuManager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
-
- getSite().registerContextMenu(menuManager, viewer);
-
- Control control = viewer.getControl();
- Menu menu = menuManager.createContextMenu(control);
- menuManager.setRemoveAllWhenShown(true);
-
- control.setMenu(menu);
- }
-
- private void setInput() {
- conversation = CdmStore.createConversation();
- conversation.registerForDataStoreChanges(this);
- cdmEntitySession = CdmStore.getCurrentSessionManager().newSession(this, true);
- CdmApplicationState.getCurrentDataChangeService().register(this);
-
- List<PolytomousKey> input = CdmStore.getService(IPolytomousKeyService.class).list(PolytomousKey.class, null, null, null, null);
- if(!viewer.getControl().isDisposed()){
- viewer.setInput(input);
- }
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
- */
- @Override
- public void setFocus() {
- if(cdmEntitySession != null) {
- cdmEntitySession.bind();
- }
- viewer.getControl().setFocus();
- }
-
- /* (non-Javadoc)
- * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
- */
- @Override
- public void update(CdmDataChangeMap changeEvents) {
- if (dataChangeBehavior == null) {
- dataChangeBehavior = new PolytomousKeyViewPartDataChangeBehavior(this);
- }
-
- DataChangeBridge.handleDataChange(changeEvents, dataChangeBehavior);
- }
-
- /* (non-Javadoc)
- * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
- */
- @Override
- public ConversationHolder getConversationHolder() {
- return conversation;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.ui.part.WorkbenchPart#dispose()
- */
- @Override
- public void dispose() {
- if(conversation!=null){
- conversation.unregisterForDataStoreChanges(this);
- conversation.close();
- CdmStore.getContextManager().removeContextListener(contextListener);
- }
- if(cdmEntitySession != null) {
- cdmEntitySession.dispose();
- }
- ICdmDataChangeService currentDataChangeService = CdmApplicationState.getCurrentDataChangeService();
- if(currentDataChangeService!=null){
- currentDataChangeService.unregister(this);
- }
- super.dispose();
- }
-
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)
- */
- @Override
- public boolean postOperation(CdmBase objectAffectedByOperation) {
- getConversationHolder().bind();
- getConversationHolder().commit(true);
- viewer.refresh();
- return true;
- }
-
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#onComplete()
- */
- @Override
- public boolean onComplete() {
- return true;
- }
-
- /**
- *
- */
- public void refresh() {
- getConversationHolder().bind();
- //FIXME : Need to make sure this is a stable fix (ticket 3822)
- getConversationHolder().commit();
- List<PolytomousKey> input = CdmStore.getService(IPolytomousKeyService.class).list(PolytomousKey.class, null, null, null, null);
- if(!viewer.getControl().isDisposed()){
- viewer.setInput(input);
- }
- }
-
- public List<PolytomousKey> getKeys() {
- return (List<PolytomousKey>)viewer.getInput();
- }
-
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getCdmEntitySession()
- */
- @Override
- public ICdmEntitySession getCdmEntitySession() {
- return cdmEntitySession;
- }
-
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getRootEntities()
- */
- @Override
- public List<PolytomousKey> getRootEntities() {
- return getKeys();
- }
-
- /* (non-Javadoc)
- * @see eu.etaxonomy.cdm.api.application.ICdmChangeListener#onChange(eu.etaxonomy.cdm.api.application.CdmChangeEvent)
- */
- @Override
- public void onChange(CdmChangeEvent event) {
- if(event.getAction() == Action.Delete && PolytomousKey.class.equals(event.getEntityType())) {
- refresh();
- }
-
- }
-
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getPropertyPathsMap()
- */
- @Override
- public Map<Object, List<String>> getPropertyPathsMap() {
- // TODO Auto-generated method stub
- return null;
- }
-
-}
+++ /dev/null
-/**
-* Copyright (C) 2007 EDIT
-* European Distributed Institute of Taxonomy
-* http://www.e-taxonomy.eu
-*
-* The contents of this file are subject to the Mozilla Public License Version 1.1
-* See LICENSE.TXT at the top of this package for the full license terms.
-*/
-
-package eu.etaxonomy.taxeditor.navigation.key.polytomous;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.swt.widgets.Display;
-
-import eu.etaxonomy.cdm.model.common.CdmBase;
-import eu.etaxonomy.cdm.model.description.PolytomousKey;
-import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent;
-import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeEvent.EventType;
-import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
-import eu.etaxonomy.taxeditor.model.AbstractDataChangeBehaviour;
-import eu.etaxonomy.taxeditor.navigation.l10n.Messages;
-
-/**
- * @author n.hoffmann
- * @created May 5, 2011
- * @version 1.0
- */
-public class PolytomousKeyViewPartDataChangeBehavior extends
- AbstractDataChangeBehaviour {
-
- private static final String UPDATING_POLYTOMOUS_KEY_VIEWER = Messages.PolytomousKeyViewPartDataChangeBehavior_UPDATE;
- private final PolytomousKeyViewPart source;
-
- /**
- * @param polytomousKeyViewPart
- */
- public PolytomousKeyViewPartDataChangeBehavior(
- PolytomousKeyViewPart polytomousKeyViewPart) {
- source = polytomousKeyViewPart;
- }
-
- /* (non-Javadoc)
- * @see eu.etaxonomy.taxeditor.model.AbstractDataChangeBehaviour#reactOnDataChange(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
- */
- @Override
- public void reactOnDataChange(CdmDataChangeMap changeEvents) {
- if(isRelevant(changeEvents)){
- final Display display = Display.getCurrent();
- Job job = new Job(UPDATING_POLYTOMOUS_KEY_VIEWER) {
-
- @Override
- protected IStatus run(IProgressMonitor monitor) {
- monitor.beginTask(UPDATING_POLYTOMOUS_KEY_VIEWER, 3);
- monitor.worked(1);
-
- // clear the session completely
- monitor.subTask(Messages.PolytomousKeyViewPartDataChangeBehavior_CLEAR);
- display.asyncExec(new Runnable() {
- @Override
- public void run() {
- source.getConversationHolder().clear();
- }
- });
- // FIXME completely clearing the session is a brute force approach.
- // It would be much more elegant to clear only those elements that have been changed.
- // I could not get that to work but we should consider workin on this because we might
- // run into serious performance issues, especially when it comes to large trees
- //
- // at least, we moved this to a job so it can run in a background thred
- // seems to improve the situation but not sure if final solution
- monitor.worked(1);
-
- monitor.subTask(Messages.PolytomousKeyViewPartDataChangeBehavior_REFRESH);
-
- display.asyncExec(new Runnable() {
- @Override
- public void run() {
- source.refresh();
- }
- });
-
-
-
- monitor.worked(1);
- monitor.done();
- return Status.OK_STATUS;
- }
- };
-
- job.setPriority(Job.SHORT);
- job.schedule();
-
- }
- }
-
- /**
- * @return
- */
- private boolean isRelevant(CdmDataChangeMap changeEvents) {
- for(CdmDataChangeEvent event : changeEvents.getAllEvents()){
- EventType eventType = event.getEventType();
- CdmBase eventEntity = event.getEntity();
-
- // all poyltomous key changes are relevant
- if((eventType == EventType.INSERT || eventType == EventType.DELETE || eventType == EventType.UPDATE)
- && eventEntity instanceof PolytomousKey){
- return true;
- }
- }
- return false;
- }
-}