1 20 21 package org.apache.directory.ldapstudio.browser.common.widgets.entryeditor; 22 23 24 import java.util.Arrays ; 25 import java.util.Comparator ; 26 27 import org.apache.directory.ldapstudio.browser.common.BrowserCommonActivator; 28 import org.apache.directory.ldapstudio.browser.common.BrowserCommonConstants; 29 import org.apache.directory.ldapstudio.browser.core.BrowserCoreConstants; 30 import org.apache.directory.ldapstudio.browser.core.model.IAttribute; 31 import org.apache.directory.ldapstudio.browser.core.model.IValue; 32 import org.eclipse.jface.viewers.TreeViewer; 33 import org.eclipse.jface.viewers.Viewer; 34 import org.eclipse.jface.viewers.ViewerSorter; 35 import org.eclipse.swt.events.SelectionEvent; 36 import org.eclipse.swt.events.SelectionListener; 37 import org.eclipse.swt.widgets.TreeColumn; 38 39 40 46 public class EntryEditorWidgetSorter extends ViewerSorter implements SelectionListener 47 { 48 49 50 private TreeViewer viewer; 51 52 53 private int sortBy; 54 55 56 private int sortOrder; 57 58 59 private EntryEditorWidgetPreferences preferences; 60 61 62 67 public EntryEditorWidgetSorter( EntryEditorWidgetPreferences preferences ) 68 { 69 this.sortBy = BrowserCoreConstants.SORT_BY_NONE; 70 this.sortOrder = BrowserCoreConstants.SORT_ORDER_NONE; 71 this.preferences = preferences; 72 } 73 74 75 80 public void connect( TreeViewer viewer ) 81 { 82 this.viewer = viewer; 83 viewer.setSorter( this ); 84 85 TreeColumn[] columns = ( ( TreeViewer ) viewer ).getTree().getColumns(); 86 for ( int i = 0; i < columns.length; i++ ) 87 { 88 columns[i].addSelectionListener( this ); 89 } 90 } 91 92 93 96 public void dispose() 97 { 98 viewer = null; 99 preferences = null; 100 } 101 102 103 106 public void widgetDefaultSelected( SelectionEvent e ) 107 { 108 } 109 110 111 116 public void widgetSelected( SelectionEvent e ) 117 { 118 if ( e.widget instanceof TreeColumn && viewer != null ) 119 { 120 int index = viewer.getTree().indexOf( ( ( TreeColumn ) e.widget ) ); 121 switch ( index ) 122 { 123 case EntryEditorWidgetTableMetadata.KEY_COLUMN_INDEX: 124 if ( sortBy == BrowserCoreConstants.SORT_BY_ATTRIBUTE_DESCRIPTION ) 125 { 126 sortOrder = sortOrder == BrowserCoreConstants.SORT_ORDER_NONE ? BrowserCoreConstants.SORT_ORDER_ASCENDING 128 : sortOrder == BrowserCoreConstants.SORT_ORDER_ASCENDING ? BrowserCoreConstants.SORT_ORDER_DESCENDING 129 : BrowserCoreConstants.SORT_ORDER_NONE; 130 } 131 else 132 { 133 sortBy = BrowserCoreConstants.SORT_BY_ATTRIBUTE_DESCRIPTION; 135 sortOrder = BrowserCoreConstants.SORT_ORDER_ASCENDING; 136 } 137 break; 138 case EntryEditorWidgetTableMetadata.VALUE_COLUMN_INDEX: 139 if ( sortBy == BrowserCoreConstants.SORT_BY_VALUE ) 140 { 141 sortOrder = sortOrder == BrowserCoreConstants.SORT_ORDER_NONE ? BrowserCoreConstants.SORT_ORDER_ASCENDING 143 : sortOrder == BrowserCoreConstants.SORT_ORDER_ASCENDING ? BrowserCoreConstants.SORT_ORDER_DESCENDING 144 : BrowserCoreConstants.SORT_ORDER_NONE; 145 } 146 else 147 { 148 sortBy = BrowserCoreConstants.SORT_BY_VALUE; 150 sortOrder = BrowserCoreConstants.SORT_ORDER_ASCENDING; 151 } 152 break; 153 default: 154 ; 155 } 156 if ( sortOrder == BrowserCoreConstants.SORT_ORDER_NONE ) 157 { 158 sortBy = BrowserCoreConstants.SORT_BY_NONE; 159 } 160 161 TreeColumn[] columns = viewer.getTree().getColumns(); 162 for ( int i = 0; i < columns.length; i++ ) 163 { 164 columns[i].setImage( null ); 165 } 166 167 if ( sortOrder == BrowserCoreConstants.SORT_ORDER_ASCENDING ) 168 { 169 ( ( TreeColumn ) e.widget ).setImage( BrowserCommonActivator.getDefault().getImage( 170 BrowserCommonConstants.IMG_SORT_ASCENDING ) ); 171 } 172 else if ( sortOrder == BrowserCoreConstants.SORT_ORDER_DESCENDING ) 173 { 174 ( ( TreeColumn ) e.widget ).setImage( BrowserCommonActivator.getDefault().getImage( 175 BrowserCommonConstants.IMG_SORT_DESCENDING ) ); 176 } 177 178 viewer.refresh(); 179 } 180 } 181 182 183 186 public void sort( final Viewer viewer, Object [] elements ) 187 { 188 Arrays.sort( elements, new Comparator <Object >() 189 { 190 public int compare( Object a, Object b ) 191 { 192 return EntryEditorWidgetSorter.this.compare( viewer, a, b ); 193 } 194 } ); 195 196 } 197 198 199 202 public int compare( Viewer viewer, Object o1, Object o2 ) 203 { 204 IAttribute attribute1 = null; 206 IValue value1 = null; 207 if ( o1 instanceof IAttribute ) 208 { 209 attribute1 = ( IAttribute ) o1; 210 } 211 else if ( o1 instanceof IValue ) 212 { 213 value1 = ( IValue ) o1; 214 attribute1 = value1.getAttribute(); 215 } 216 217 IAttribute attribute2 = null; 219 IValue value2 = null; 220 if ( o2 instanceof IAttribute ) 221 { 222 attribute2 = ( IAttribute ) o2; 223 } 224 else if ( o2 instanceof IValue ) 225 { 226 value2 = ( IValue ) o2; 227 attribute2 = value2.getAttribute(); 228 } 229 230 if ( value1 != null && value2 != null ) 232 { 233 if ( getSortByOrDefault() == BrowserCoreConstants.SORT_BY_ATTRIBUTE_DESCRIPTION ) 234 { 235 if ( value1.getAttribute() != value2.getAttribute() ) 236 { 237 return compareAttributes( value1.getAttribute(), value2.getAttribute() ); 238 } 239 else 240 { 241 return compareValues( value1, value2 ); 242 } 243 } 244 else if ( getSortByOrDefault() == BrowserCoreConstants.SORT_BY_VALUE ) 245 { 246 return compareValues( value1, value2 ); 247 } 248 else 249 { 250 return equal(); 251 } 252 } 253 else if ( attribute1 != null && attribute2 != null ) 254 { 255 return compareAttributes( attribute1, attribute2 ); 256 } 257 else 258 { 259 return equal(); 260 } 261 } 262 263 264 272 private int compareAttributes( IAttribute attribute1, IAttribute attribute2 ) 273 { 274 if ( this.sortOrder == BrowserCoreConstants.SORT_ORDER_NONE ) 275 { 276 if ( preferences == null || preferences.isObjectClassAndMustAttributesFirst() ) 277 { 278 if ( attribute1.isObjectClassAttribute() ) 279 { 280 return lessThan(); 281 } 282 else if ( attribute2.isObjectClassAttribute() ) 283 { 284 return greaterThan(); 285 } 286 287 if ( attribute1.isMustAttribute() && !attribute2.isMustAttribute() ) 288 { 289 return lessThan(); 290 } 291 else if ( attribute2.isMustAttribute() && !attribute1.isMustAttribute() ) 292 { 293 return greaterThan(); 294 } 295 } 296 if ( preferences == null || preferences.isOperationalAttributesLast() ) 297 { 298 if ( attribute1.isOperationalAttribute() && !attribute2.isOperationalAttribute() ) 299 { 300 return greaterThan(); 301 } 302 else if ( attribute2.isOperationalAttribute() && !attribute1.isOperationalAttribute() ) 303 { 304 return lessThan(); 305 } 306 } 307 } 308 309 return compare( attribute1.getDescription(), attribute2.getDescription() ); 310 } 311 312 313 321 private int compareValues( IValue value1, IValue value2 ) 322 { 323 if ( value1.isEmpty() && value2.isEmpty() ) 324 { 325 return equal(); 326 } 327 else if ( value1.isEmpty() && !value2.isEmpty() ) 328 { 329 return greaterThan(); 330 } 331 else if ( !value1.isEmpty() && value2.isEmpty() ) 332 { 333 return lessThan(); 334 } 335 else 336 { 337 return compare( value1.getStringValue(), value2.getStringValue() ); 338 } 339 } 340 341 342 347 private int getSortOrderOrDefault() 348 { 349 if ( preferences == null ) 350 { 351 return BrowserCoreConstants.SORT_ORDER_ASCENDING; 352 } 353 else if ( sortOrder == BrowserCoreConstants.SORT_ORDER_NONE ) 354 { 355 return preferences.getDefaultSortOrder(); 356 } 357 else 358 { 359 return sortOrder; 360 } 361 } 362 363 364 369 private int getSortByOrDefault() 370 { 371 if ( preferences == null ) 372 { 373 return BrowserCoreConstants.SORT_BY_ATTRIBUTE_DESCRIPTION; 374 } 375 else if ( sortBy == BrowserCoreConstants.SORT_BY_NONE ) 376 { 377 return preferences.getDefaultSortBy(); 378 } 379 else 380 { 381 return sortBy; 382 } 383 } 384 385 386 391 private int lessThan() 392 { 393 return this.getSortOrderOrDefault() == BrowserCoreConstants.SORT_ORDER_ASCENDING ? -1 : 1; 394 } 395 396 397 402 private int equal() 403 { 404 return 0; 405 } 406 407 408 413 private int greaterThan() 414 { 415 return this.getSortOrderOrDefault() == BrowserCoreConstants.SORT_ORDER_ASCENDING ? 1 : -1; 416 } 417 418 419 428 private int compare( String s1, String s2 ) 429 { 430 return this.getSortOrderOrDefault() == BrowserCoreConstants.SORT_ORDER_ASCENDING ? s1.compareToIgnoreCase( s2 ) 431 : s2.compareToIgnoreCase( s1 ); 432 } 433 434 } 435 | Popular Tags |