KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > directory > ldapstudio > browser > common > widgets > browser > BrowserUniversalListener


1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements. See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership. The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the
7  * "License"); you may not use this file except in compliance
8  * with the License. You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing,
13  * software distributed under the License is distributed on an
14  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15  * KIND, either express or implied. See the License for the
16  * specific language governing permissions and limitations
17  * under the License.
18  *
19  */

20
21 package org.apache.directory.ldapstudio.browser.common.widgets.browser;
22
23
24 import org.apache.directory.ldapstudio.browser.common.BrowserCommonActivator;
25 import org.apache.directory.ldapstudio.browser.core.events.AttributesInitializedEvent;
26 import org.apache.directory.ldapstudio.browser.core.events.ConnectionUpdateEvent;
27 import org.apache.directory.ldapstudio.browser.core.events.ConnectionUpdateListener;
28 import org.apache.directory.ldapstudio.browser.core.events.EntryModificationEvent;
29 import org.apache.directory.ldapstudio.browser.core.events.EntryUpdateListener;
30 import org.apache.directory.ldapstudio.browser.core.events.EventRegistry;
31 import org.apache.directory.ldapstudio.browser.core.model.IEntry;
32 import org.eclipse.jface.viewers.DoubleClickEvent;
33 import org.eclipse.jface.viewers.IDoubleClickListener;
34 import org.eclipse.jface.viewers.IStructuredSelection;
35 import org.eclipse.jface.viewers.ITreeContentProvider;
36 import org.eclipse.jface.viewers.ITreeViewerListener;
37 import org.eclipse.jface.viewers.TreeExpansionEvent;
38 import org.eclipse.jface.viewers.TreeViewer;
39
40
41 /**
42  * The BrowserUniversalListener manages all events for the browser widget.
43  *
44  * @author <a HREF="mailto:dev@directory.apache.org">Apache Directory Project</a>
45  * @version $Rev$, $Date$
46  */

47 public class BrowserUniversalListener implements ConnectionUpdateListener, EntryUpdateListener
48 {
49
50     /** The tree viewer */
51     protected TreeViewer viewer;
52
53     /** The tree viewer listener */
54     private ITreeViewerListener treeViewerListener = new ITreeViewerListener()
55     {
56         /**
57          * {@inheritDoc}
58          *
59          * This implementation checks if the collapsed entry more children
60          * than currently fetched. If this is the case cached children are
61          * cleared an must be fetched newly when expanding the tree.
62          *
63          * This could happen when first using a search that returns
64          * only some of an entry's children.
65          */

66         public void treeCollapsed( TreeExpansionEvent event )
67         {
68             if ( event.getElement() instanceof IEntry )
69             {
70                 IEntry entry = ( IEntry ) event.getElement();
71                 if ( entry.isChildrenInitialized() && entry.hasMoreChildren()
72                     && entry.getChildrenCount() < entry.getConnection().getCountLimit() )
73                 {
74                     entry.setChildrenInitialized( false );
75                 }
76             }
77         }
78
79
80         /**
81          * {@inheritDoc}
82          */

83         public void treeExpanded( TreeExpansionEvent event )
84         {
85         }
86     };
87
88     /** The double click listener. */
89     private IDoubleClickListener doubleClickListener = new IDoubleClickListener()
90     {
91
92         public void doubleClick( DoubleClickEvent event )
93         {
94             if ( event.getSelection() instanceof IStructuredSelection )
95             {
96                 Object JavaDoc obj = ( ( IStructuredSelection ) event.getSelection() ).getFirstElement();
97                 if ( viewer.getExpandedState( obj ) )
98                 {
99                     viewer.collapseToLevel( obj, 1 );
100                 }
101                 else if ( ( ( ITreeContentProvider ) viewer.getContentProvider() ).hasChildren( obj ) )
102                 {
103                     viewer.expandToLevel( obj, 1 );
104                 }
105             }
106         }
107
108     };
109
110
111     /**
112      * Creates a new instance of BrowserUniversalListener.
113      *
114      * @param viewer the tree viewer
115      */

116     public BrowserUniversalListener( TreeViewer viewer )
117     {
118         this.viewer = viewer;
119
120         viewer.addTreeListener( treeViewerListener );
121         viewer.addDoubleClickListener( doubleClickListener );
122
123         EventRegistry.addConnectionUpdateListener( this, BrowserCommonActivator.getDefault().getEventRunner() );
124         EventRegistry.addEntryUpdateListener( this, BrowserCommonActivator.getDefault().getEventRunner() );
125     }
126
127
128     /**
129      * Disposes this listener.
130      */

131     public void dispose()
132     {
133         if ( viewer != null )
134         {
135             viewer.removeTreeListener( treeViewerListener );
136             viewer.removeDoubleClickListener( doubleClickListener );
137
138             EventRegistry.removeConnectionUpdateListener( this );
139             EventRegistry.removeEntryUpdateListener( this );
140
141             viewer = null;
142         }
143     }
144
145
146     /**
147      * {@inheritDoc}
148      *
149      * This implementation refreshes the tree and collapses the
150      * tree when the connection is closed.
151      */

152     public void connectionUpdated( ConnectionUpdateEvent connectionUpdateEvent )
153     {
154         if ( connectionUpdateEvent.getDetail() == ConnectionUpdateEvent.EventDetail.CONNECTION_CLOSED )
155         {
156             viewer.collapseAll();
157         }
158         else if ( connectionUpdateEvent.getDetail() == ConnectionUpdateEvent.EventDetail.CONNECTION_OPENED )
159         {
160             viewer.refresh( connectionUpdateEvent.getConnection() );
161         }
162         else
163         {
164             viewer.refresh( connectionUpdateEvent.getConnection() );
165         }
166     }
167
168
169     /**
170      * {@inheritDoc}
171      *
172      * This implementation refreshes the tree.
173      */

174     public void entryUpdated( EntryModificationEvent event )
175     {
176         // Don't handle attribute initalization, could cause double
177
// retrieval of children.
178
//
179
// When double-clicking an entry two Jobs/Threads are started:
180
// - InitializeAttributesJob and
181
// - InitializeChildrenJob
182
// If the InitializeAttributesJob is finished first the
183
// AttributesInitializedEvent is fired. If this causes
184
// a refresh of the tree before the children are initialized
185
// another InitializeChildrenJob is executed.
186
if ( event instanceof AttributesInitializedEvent )
187         {
188             return;
189         }
190
191         viewer.refresh( event.getModifiedEntry(), true );
192
193     }
194
195 }
196
Popular Tags