1 11 package org.eclipse.help.ui.internal.views; 12 13 import org.eclipse.help.ui.internal.IHelpUIConstants; 14 import org.eclipse.help.ui.internal.Messages; 15 import org.eclipse.jface.action.IAction; 16 import org.eclipse.jface.action.IMenuManager; 17 import org.eclipse.jface.action.IToolBarManager; 18 import org.eclipse.swt.SWT; 19 import org.eclipse.swt.events.KeyEvent; 20 import org.eclipse.swt.events.KeyListener; 21 import org.eclipse.swt.events.ModifyEvent; 22 import org.eclipse.swt.events.ModifyListener; 23 import org.eclipse.swt.events.SelectionAdapter; 24 import org.eclipse.swt.events.SelectionEvent; 25 import org.eclipse.swt.widgets.Button; 26 import org.eclipse.swt.widgets.Composite; 27 import org.eclipse.swt.widgets.Control; 28 import org.eclipse.swt.widgets.Text; 29 import org.eclipse.swt.widgets.Tree; 30 import org.eclipse.swt.widgets.TreeItem; 31 import org.eclipse.ui.IMemento; 32 import org.eclipse.ui.forms.AbstractFormPart; 33 import org.eclipse.ui.forms.widgets.FormText; 34 import org.eclipse.ui.forms.widgets.FormToolkit; 35 import org.eclipse.ui.forms.widgets.TableWrapData; 36 import org.eclipse.ui.forms.widgets.TableWrapLayout; 37 38 39 public class IndexTypeinPart extends AbstractFormPart implements IHelpPart, IHelpUIConstants { 40 private ReusableHelpPart parent; 41 String id; 42 private Composite container; 43 private FormText indexInstructions; 44 private Text indexText; 45 private Button indexButton; 46 private IndexPart indexPart; 47 private Tree indexTree; 48 private int itemCount; 49 private String [] rootItems; 50 private int currentIndex; 51 52 public IndexTypeinPart(Composite parent, FormToolkit toolkit, IToolBarManager tbm) { 53 container = toolkit.createComposite(parent); 54 55 TableWrapLayout layout = new TableWrapLayout(); 56 layout.numColumns = 2; 57 container.setLayout(layout); 58 59 indexInstructions = toolkit.createFormText(container, false); 61 indexInstructions.setText(Messages.IndexInstructions, false, false); 62 TableWrapData td = new TableWrapData(); 63 td.colspan = 2; 64 indexInstructions.setLayoutData(td); 65 66 indexText = toolkit.createText(container, null); 68 td = new TableWrapData(TableWrapData.FILL_GRAB); 69 td.maxWidth = 100; 70 td.valign = TableWrapData.MIDDLE; 71 indexText.setLayoutData(td); 72 indexButton = toolkit.createButton(container, Messages.IndexButton, SWT.PUSH); 73 indexButton.setEnabled(false); 74 75 indexText.addModifyListener(new ModifyListener() { 76 public void modifyText(ModifyEvent e) { 77 indexButton.setEnabled(indexText.getText().length() > 0); doNavigate(indexText.getText()); 79 }}); 80 indexText.addKeyListener(new KeyListener() { 81 public void keyReleased(KeyEvent e) { 82 if (e.character == '\r' && indexButton.isEnabled()) { 83 doOpen(); 84 } 85 } 86 public void keyPressed(KeyEvent e) { 87 if (e.keyCode == SWT.ARROW_UP) { 88 e.doit = false; 89 doUp(); 90 } else if (e.keyCode == SWT.ARROW_DOWN) { 91 e.doit = false; 92 doDown(); 93 } 94 }}); 95 indexButton.addSelectionListener(new SelectionAdapter() { 96 public void widgetSelected(SelectionEvent e) { 97 doOpen(); 98 }}); 99 100 toolkit.paintBordersFor(container); 101 102 currentIndex = -1; 103 } 104 105 protected void doUp() { 106 checkTree(); 107 if (indexTree == null) return; 108 109 int index = 0; 110 TreeItem[] items = indexTree.getSelection(); 111 if (items.length > 0) { 112 index = indexTree.indexOf(items[0]) - 1; 113 if (index < 0) { 114 return; 115 } 116 } 117 TreeItem item = indexTree.getItem(index); 118 indexTree.setSelection(new TreeItem[] { item }); 119 String text = item.getText(); 120 indexText.setText(text); 121 indexText.setSelection(0, text.length()); 122 } 123 124 protected void doDown() { 125 checkTree(); 126 if (indexTree == null) return; 127 128 int index = 0; 129 TreeItem[] items = indexTree.getSelection(); 130 if (items.length > 0) { 131 index = indexTree.indexOf(items[0]) + 1; 132 if (index >= indexTree.getItemCount()) { 133 return; 134 } 135 } 136 TreeItem item = indexTree.getItem(index); 137 indexTree.setSelection(new TreeItem[] { item }); 138 String text = item.getText(); 139 indexText.setText(text); 140 indexText.setSelection(0, text.length()); 141 } 142 143 protected void doNavigate(String text) { 144 checkTree(); 145 if (rootItems == null) return; 146 147 int index = searchPattern(text); 148 if (index != -1 && index != currentIndex) { 149 indexTree.setSelection(new TreeItem[] { indexTree.getItem(index) }); 150 currentIndex = index; 151 } 152 } 153 154 private void checkTree() { 155 if (rootItems != null) return; 156 157 indexPart = (IndexPart)parent.findPart(HV_INDEX); 158 if (indexPart == null) return; 159 160 indexTree = indexPart.getTreeWidget(); 161 if (indexTree == null) return; 162 163 itemCount = indexTree.getItemCount(); 164 if (itemCount == 0) { 165 indexTree = null; 166 } else { 167 rootItems = new String [itemCount]; 168 for (int i = 0; i < itemCount; i++) { 169 rootItems[i] = indexTree.getItem(i).getText(); 170 } 171 } 172 } 173 174 177 private int searchPattern(String pattern) { 178 int from = 0; 179 int to = rootItems.length; 180 int i; 181 int res; 182 183 while (to > from) { 184 i = (to + from) / 2; 185 res = compare(rootItems[i], pattern); 186 if (res == 0) { 187 while (i > 0) { 188 if (compare(rootItems[--i], pattern) != 0) { 189 i++; 190 break; 191 } 192 } 193 return i; 194 } 195 196 if (res < 0) { 197 from = i + 1; 198 } else { 199 to = i; 200 } 201 } 202 203 return -1; 204 } 205 206 209 int compare(String keyword, String pattern) { 210 int kI = 0, pI = 0; 211 char kCh, pCh; 212 213 while (kI < keyword.length() && pI < pattern.length()) { 214 kCh = Character.toLowerCase(keyword.charAt(kI)); 215 pCh = Character.toLowerCase(pattern.charAt(pI)); 216 if (kCh > pCh) { 217 return 1; 218 } else if (kCh < pCh) { 219 return -1; 220 } 221 kI++; 222 pI++; 223 } 224 if (keyword.length() >= pattern.length()) { 225 return 0; 226 } else { 227 return -1; 228 } 229 } 230 231 protected void doOpen() { 232 checkTree(); 233 if (indexTree == null) return; 234 235 TreeItem items[] = indexTree.getSelection(); 236 if (items.length == 0) return; 237 238 Object obj = items[0].getData(); 239 if (obj != null) { 240 indexPart.doOpen(obj); 241 } 242 } 243 244 public void init(ReusableHelpPart parent, String id, IMemento memento) { 245 this.parent = parent; 246 this.id = id; 247 } 248 249 public void saveState(IMemento memento) { 250 } 251 252 public Control getControl() { 253 return container; 254 } 255 256 public String getId() { 257 return id; 258 } 259 260 public void setVisible(boolean visible) { 261 getControl().setVisible(visible); 262 } 263 264 public boolean hasFocusControl(Control control) { 265 return false; 266 } 267 268 public boolean fillContextMenu(IMenuManager manager) { 269 return false; 270 } 271 272 public IAction getGlobalAction(String id) { 273 return null; 274 } 275 276 public void stop() { 277 } 278 279 public void toggleRoleFilter() { 280 } 281 282 public void refilter() { 283 } 284 285 public void setFocus() { 286 indexText.setFocus(); 287 } 288 289 public Text getTextWidget() { 290 return indexText; 291 } 292 } 293 | Popular Tags |