try {  final ISourceViewer viewer= getSourceViewer(); final IDocument document= viewer.getDocument();  int position= widgetOffset2ModelOffset(viewer, viewer.getTextWidget().getCaretOffset()) - 1;
final IPreferenceStore store= getPreferenceStore(); if (!store.getBoolean(PreferenceConstants.EDITOR_SUB_WORD_NAVIGATION)) { super.run(); return; }
		public void run() {			try {				final ISourceViewer viewer= getSourceViewer();				final IDocument document= viewer.getDocument();				int position= widgetOffset2ModelOffset(viewer, viewer.getTextWidget().getCaretOffset()) - 1;							// Check whether we are in a java code partition and the preference is enabled				final IPreferenceStore store= getPreferenceStore();				if (!store.getBoolean(PreferenceConstants.EDITOR_SUB_WORD_NAVIGATION)) {					super.run();					return;								}				// Ignore trailing white spaces				char character= document.getChar(position);				while (position > 0 && Character.isWhitespace(character)) {					--position;					character= document.getChar(position);				}				// Check whether left hand character of caret is valid identifier part				if (Character.isJavaIdentifierPart(character)) {					int offset= 0;					int order= CollationElementIterator.NULLORDER;					short previous= Short.MAX_VALUE;					short next= Short.MAX_VALUE;					// Acquire collator for partition around caret					final ITypedRegion region= TextUtilities.getPartition(document, IJavaPartitions.JAVA_PARTITIONING, position, false);					final String buffer= document.get(region.getOffset(), position - region.getOffset() + 1);					final CollationElementIterator iterator= fCollator.getCollationElementIterator(buffer);					// Iterate to first upper-case character					iterator.setOffset(buffer.length() - 1);					do {						// Check whether we reached begin of word or single upper-case start						offset= iterator.getOffset();						character= document.getChar(region.getOffset() + offset);						if (!Character.isJavaIdentifierPart(character)) {							int caret= widgetOffset2ModelOffset(viewer, viewer.getTextWidget().getCaretOffset());							int current= region.getOffset() + offset + 2;							if (caret > current)								setCaretPosition(current);							super.run();							return;						} else if (Character.isUpperCase(character)) {							++offset;							break;						}						// Test next characters						order= iterator.previous();						next= CollationElementIterator.tertiaryOrder(order);						if (next <= previous)							previous= next;						else							break;					} while (order != CollationElementIterator.NULLORDER);					// Check left character for multiple upper-case characters					position= position - buffer.length() + offset - 1;					character= document.getChar(position);					while (position >= 0 && Character.isUpperCase(character))						character= document.getChar(--position);					setCaretPosition(position + 1);					getTextWidget().showSelection();					fireSelectionChanged();					return;				}			} catch (BadLocationException exception) {				// Use default behavior			}			super.run();		}