4 package eu
.etaxonomy
.taxeditor
.navigation
.key
.polytomous
;
9 import org
.eclipse
.core
.commands
.Command
;
10 import org
.eclipse
.core
.commands
.common
.NotDefinedException
;
11 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
12 import org
.eclipse
.jface
.action
.GroupMarker
;
13 import org
.eclipse
.jface
.action
.MenuManager
;
14 import org
.eclipse
.jface
.viewers
.ColumnLabelProvider
;
15 import org
.eclipse
.jface
.viewers
.DoubleClickEvent
;
16 import org
.eclipse
.jface
.viewers
.IDoubleClickListener
;
17 import org
.eclipse
.jface
.viewers
.ISelection
;
18 import org
.eclipse
.jface
.viewers
.ListViewer
;
19 import org
.eclipse
.jface
.viewers
.Viewer
;
20 import org
.eclipse
.jface
.viewers
.ViewerFilter
;
21 import org
.eclipse
.swt
.SWT
;
22 import org
.eclipse
.swt
.events
.ModifyEvent
;
23 import org
.eclipse
.swt
.events
.ModifyListener
;
24 import org
.eclipse
.swt
.layout
.GridData
;
25 import org
.eclipse
.swt
.layout
.GridLayout
;
26 import org
.eclipse
.swt
.widgets
.Composite
;
27 import org
.eclipse
.swt
.widgets
.Control
;
28 import org
.eclipse
.swt
.widgets
.Display
;
29 import org
.eclipse
.swt
.widgets
.Event
;
30 import org
.eclipse
.swt
.widgets
.Menu
;
31 import org
.eclipse
.swt
.widgets
.Text
;
32 import org
.eclipse
.ui
.IMemento
;
33 import org
.eclipse
.ui
.IWorkbenchActionConstants
;
34 import org
.eclipse
.ui
.commands
.ICommandService
;
35 import org
.eclipse
.ui
.handlers
.IHandlerService
;
36 import org
.eclipse
.ui
.part
.ViewPart
;
38 import eu
.etaxonomy
.cdm
.api
.application
.CdmApplicationState
;
39 import eu
.etaxonomy
.cdm
.api
.application
.CdmChangeEvent
;
40 import eu
.etaxonomy
.cdm
.api
.application
.CdmChangeEvent
.Action
;
41 import eu
.etaxonomy
.cdm
.api
.application
.ICdmChangeListener
;
42 import eu
.etaxonomy
.cdm
.api
.application
.ICdmDataChangeService
;
43 import eu
.etaxonomy
.cdm
.api
.conversation
.ConversationHolder
;
44 import eu
.etaxonomy
.cdm
.api
.conversation
.IConversationEnabled
;
45 import eu
.etaxonomy
.cdm
.api
.service
.IPolytomousKeyService
;
46 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
47 import eu
.etaxonomy
.cdm
.model
.description
.PolytomousKey
;
48 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.CdmDataChangeMap
;
49 import eu
.etaxonomy
.taxeditor
.model
.ContextListenerAdapter
;
50 import eu
.etaxonomy
.taxeditor
.model
.DataChangeBridge
;
51 import eu
.etaxonomy
.taxeditor
.model
.IContextListener
;
52 import eu
.etaxonomy
.taxeditor
.model
.MessagingUtils
;
53 import eu
.etaxonomy
.taxeditor
.navigation
.l10n
.Messages
;
54 import eu
.etaxonomy
.taxeditor
.operation
.IPostOperationEnabled
;
55 import eu
.etaxonomy
.taxeditor
.session
.ICdmEntitySession
;
56 import eu
.etaxonomy
.taxeditor
.session
.ICdmEntitySessionEnabled
;
57 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
58 import eu
.etaxonomy
.taxeditor
.ui
.element
.CdmFormFactory
;
64 public class PolytomousKeyViewPart
extends ViewPart
implements
65 IConversationEnabled
, ICdmEntitySessionEnabled
, IPostOperationEnabled
,
68 private class FilterModifyListener
implements ModifyListener
{
70 public void modifyText(ModifyEvent e
) {
71 ViewerFilter filter
= new ViewerFilter(){
74 public boolean select(Viewer viewer
, Object parentElement
,
77 if(element
instanceof PolytomousKey
){
78 PolytomousKey key
= (PolytomousKey
) element
;
79 if(key
.getTitleCache().contains(text_filter
.getText())){
89 viewer
.setFilters(new ViewerFilter
[]{filter
});
94 public static final String ID
= "eu.etaxonomy.taxeditor.navigation.key.polytomous.polytomousKeyViewPart"; //$NON-NLS-1$
96 public static final String OPEN_COMMAND_ID
= "eu.etaxonomy.taxeditor.navigation.key.polytomous.editNodes"; //$NON-NLS-1$
98 private class ContextListener
extends ContextListenerAdapter
{
100 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
103 public void contextStop(IMemento memento
, IProgressMonitor monitor
) {
104 monitor
.subTask(Messages
.PolytomousKeyViewPart_SHUTDOWN
);
105 if(!viewer
.getControl().isDisposed()){
106 viewer
.setInput(null);
111 * @see eu.etaxonomy.taxeditor.model.ContextListenerAdapter#contextStart(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
114 public void contextStart(IMemento memento
, IProgressMonitor monitor
) {
115 monitor
.subTask(Messages
.PolytomousKeyViewPart_INIT
);
120 private ListViewer viewer
;
121 private ConversationHolder conversation
;
122 private IContextListener contextListener
;
123 private final CdmFormFactory formFactory
;
124 private Text text_filter
;
125 private ICdmEntitySession cdmEntitySession
;
127 private PolytomousKeyViewPartDataChangeBehavior dataChangeBehavior
;
129 public PolytomousKeyViewPart(){
130 formFactory
= new CdmFormFactory(Display
.getDefault());
134 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
137 public void createPartControl(Composite parent
) {
139 Composite container
= new Composite(parent
, SWT
.NONE
);
140 container
.setLayout(new GridLayout());
142 contextListener
= new ContextListener();
143 CdmStore
.getContextManager().addContextListener(contextListener
);
145 text_filter
= formFactory
.createText(container
, ""); //$NON-NLS-1$
146 text_filter
.setLayoutData(new GridData(SWT
.FILL
, SWT
.TOP
, true, false));
147 text_filter
.addModifyListener(new FilterModifyListener());
149 viewer
= new ListViewer(container
, SWT
.H_SCROLL
| SWT
.V_SCROLL
| SWT
.MULTI
);
150 viewer
.getControl().setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
152 viewer
.setContentProvider(new PolytomousKeyContentProvider());
153 viewer
.setLabelProvider(new ColumnLabelProvider());
155 viewer
.addDoubleClickListener(new IDoubleClickListener() {
158 public void doubleClick(DoubleClickEvent event
) {
159 openSelectedKeyNodes();
164 getSite().setSelectionProvider(viewer
);
168 if(CdmStore
.isActive()){
173 public void openSelectedKeyNodes() {
174 ICommandService commandService
= (ICommandService
)getSite().getService(ICommandService
.class);
176 Command command
= commandService
.getCommand(OPEN_COMMAND_ID
);
177 if(command
.isEnabled()) {
178 IHandlerService handlerService
= (IHandlerService
)getSite().getService(IHandlerService
.class);
180 handlerService
.executeCommand(OPEN_COMMAND_ID
, null);
181 } catch (NotDefinedException e
) {
182 throw new RuntimeException("Could not find open command: " + OPEN_COMMAND_ID
); //$NON-NLS-1$
183 } catch (Exception e
) {
184 MessagingUtils
.error(getClass(), Messages
.PolytomousKeyViewPart_EXCEPTION
, e
);
189 public void setViewerSelection(ISelection selection
, boolean reveal
) {
190 getSite().setSelectionProvider(viewer
);
191 viewer
.setSelection(selection
,reveal
);
192 viewer
.getList().notifyListeners(SWT
.Selection
,new Event());
195 private void createMenu(){
196 MenuManager menuManager
= new MenuManager();
197 menuManager
.add(new GroupMarker(IWorkbenchActionConstants
.MB_ADDITIONS
));
199 getSite().registerContextMenu(menuManager
, viewer
);
201 Control control
= viewer
.getControl();
202 Menu menu
= menuManager
.createContextMenu(control
);
203 menuManager
.setRemoveAllWhenShown(true);
205 control
.setMenu(menu
);
208 private void setInput() {
209 conversation
= CdmStore
.createConversation();
210 conversation
.registerForDataStoreChanges(this);
211 cdmEntitySession
= CdmStore
.getCurrentSessionManager().newSession(this, true);
212 CdmApplicationState
.getCurrentDataChangeService().register(this);
214 List
<PolytomousKey
> input
= CdmStore
.getService(IPolytomousKeyService
.class).list(PolytomousKey
.class, null, null, null, null);
215 if(!viewer
.getControl().isDisposed()){
216 viewer
.setInput(input
);
221 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
224 public void setFocus() {
225 if(cdmEntitySession
!= null) {
226 cdmEntitySession
.bind();
228 viewer
.getControl().setFocus();
232 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
235 public void update(CdmDataChangeMap changeEvents
) {
236 if (dataChangeBehavior
== null) {
237 dataChangeBehavior
= new PolytomousKeyViewPartDataChangeBehavior(this);
240 DataChangeBridge
.handleDataChange(changeEvents
, dataChangeBehavior
);
244 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
247 public ConversationHolder
getConversationHolder() {
252 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
255 public void dispose() {
256 if(conversation
!=null){
257 conversation
.unregisterForDataStoreChanges(this);
258 conversation
.close();
259 CdmStore
.getContextManager().removeContextListener(contextListener
);
261 if(cdmEntitySession
!= null) {
262 cdmEntitySession
.dispose();
264 ICdmDataChangeService currentDataChangeService
= CdmApplicationState
.getCurrentDataChangeService();
265 if(currentDataChangeService
!=null){
266 currentDataChangeService
.unregister(this);
272 * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)
275 public boolean postOperation(CdmBase objectAffectedByOperation
) {
276 getConversationHolder().bind();
277 getConversationHolder().commit(true);
283 * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#onComplete()
286 public boolean onComplete() {
293 public void refresh() {
294 getConversationHolder().bind();
295 //FIXME : Need to make sure this is a stable fix (ticket 3822)
296 getConversationHolder().commit();
297 List
<PolytomousKey
> input
= CdmStore
.getService(IPolytomousKeyService
.class).list(PolytomousKey
.class, null, null, null, null);
298 if(!viewer
.getControl().isDisposed()){
299 viewer
.setInput(input
);
303 public List
<PolytomousKey
> getKeys() {
304 return (List
<PolytomousKey
>)viewer
.getInput();
308 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getCdmEntitySession()
311 public ICdmEntitySession
getCdmEntitySession() {
312 return cdmEntitySession
;
316 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getRootEntities()
319 public List
<PolytomousKey
> getRootEntities() {
324 * @see eu.etaxonomy.cdm.api.application.ICdmChangeListener#onChange(eu.etaxonomy.cdm.api.application.CdmChangeEvent)
327 public void onChange(CdmChangeEvent event
) {
328 if(event
.getAction() == Action
.Delete
&& PolytomousKey
.class.equals(event
.getEntityType())) {
335 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getPropertyPathsMap()
338 public Map
<Object
, List
<String
>> getPropertyPathsMap() {
339 // TODO Auto-generated method stub