blob: 932dff13c2015ea7e75de7dd89d503f9f7aee357 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2016 Intel Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Intel Corporation - initial API and implementation
* IBM Corporation 2008 - Bug 248079 [Help][Index] unicode sort issue in index view
*******************************************************************************/
package org.eclipse.help.ui.internal.views;
import org.eclipse.help.ui.internal.IHelpUIConstants;
import org.eclipse.help.ui.internal.Messages;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.forms.AbstractFormPart;
import org.eclipse.ui.forms.widgets.FormText;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.TableWrapData;
import org.eclipse.ui.forms.widgets.TableWrapLayout;
import com.ibm.icu.text.Collator;
public class IndexTypeinPart extends AbstractFormPart implements IHelpPart, IHelpUIConstants {
private ReusableHelpPart parent;
String id;
private Composite container;
private FormText indexInstructions;
private Text indexText;
private Button indexButton;
private IndexPart indexPart;
private Tree indexTree;
private int itemCount;
private String[] rootItems;
private int currentIndex;
public IndexTypeinPart(Composite parent, FormToolkit toolkit, IToolBarManager tbm) {
container = toolkit.createComposite(parent);
TableWrapLayout layout = new TableWrapLayout();
layout.numColumns = 2;
container.setLayout(layout);
// Instructions
indexInstructions = toolkit.createFormText(container, false);
indexInstructions.setText(Messages.IndexInstructions, false, false);
TableWrapData td = new TableWrapData();
td.colspan = 2;
indexInstructions.setLayoutData(td);
// Index typein
indexText = toolkit.createText(container, null);
td = new TableWrapData(TableWrapData.FILL_GRAB);
td.maxWidth = 100;
td.valign = TableWrapData.MIDDLE;
indexText.setLayoutData(td);
indexButton = toolkit.createButton(container, Messages.IndexButton, SWT.PUSH);
indexButton.setEnabled(false);
indexText.addModifyListener(e -> {
indexButton.setEnabled(indexText.getText().length() > 0);// !!!
doNavigate(indexText.getText());
});
indexText.addKeyListener(new KeyListener() {
@Override
public void keyReleased(KeyEvent e) {
if (e.character == '\r' && indexButton.isEnabled()) {
doOpen();
}
}
@Override
public void keyPressed(KeyEvent e) {
if (e.keyCode == SWT.ARROW_UP) {
e.doit = false;
doUp();
} else if (e.keyCode == SWT.ARROW_DOWN) {
e.doit = false;
doDown();
}
}});
indexButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
doOpen();
}});
toolkit.paintBordersFor(container);
currentIndex = -1;
}
protected void doUp() {
checkTree();
if (indexTree == null) return;
int index = 0;
TreeItem[] items = indexTree.getSelection();
if (items.length > 0) {
index = indexTree.indexOf(items[0]) - 1;
if (index < 0) {
return;
}
}
TreeItem item = indexTree.getItem(index);
indexTree.setSelection(new TreeItem[] { item });
String text = item.getText();
indexText.setText(text);
indexText.setSelection(0, text.length());
}
protected void doDown() {
checkTree();
if (indexTree == null) return;
int index = 0;
TreeItem[] items = indexTree.getSelection();
if (items.length > 0) {
index = indexTree.indexOf(items[0]) + 1;
if (index >= indexTree.getItemCount()) {
return;
}
}
TreeItem item = indexTree.getItem(index);
indexTree.setSelection(new TreeItem[] { item });
String text = item.getText();
indexText.setText(text);
indexText.setSelection(0, text.length());
}
protected void doNavigate(String text) {
checkTree();
if (rootItems == null) return;
int index = searchPattern(text);
if (index != -1 && index != currentIndex) {
indexTree.setSelection(new TreeItem[] { indexTree.getItem(index) });
currentIndex = index;
}
}
private void checkTree() {
if (rootItems != null) return;
indexPart = (IndexPart)parent.findPart(HV_INDEX);
if (indexPart == null) return;
indexTree = indexPart.getTreeWidget();
if (indexTree == null) return;
itemCount = indexTree.getItemCount();
if (itemCount == 0) {
indexTree = null;
} else {
rootItems = new String[itemCount];
for (int i = 0; i < itemCount; i++) {
rootItems[i] = indexTree.getItem(i).getText();
}
}
}
/*
* TODO optimize
*/
private int searchPattern(String pattern) {
int from = 0;
int to = rootItems.length;
int i;
int res;
while (to > from) {
i = (to + from) / 2;
res = compare(rootItems[i], pattern);
if (res == 0) {
while (i > 0) {
if (compare(rootItems[--i], pattern) != 0) {
i++;
break;
}
}
return i;
}
if (res < 0) {
from = i + 1;
} else {
to = i;
}
}
if (from >= rootItems.length) {
return rootItems.length - 1;
} else {
return from;
}
}
int compare(String keyword, String pattern) {
return Collator.getInstance().compare(keyword, pattern);
}
protected void doOpen() {
checkTree();
if (indexTree == null) return;
TreeItem items[] = indexTree.getSelection();
if (items.length == 0) return;
Object obj = items[0].getData();
if (obj != null) {
indexPart.doOpen(obj);
}
}
@Override
public void init(ReusableHelpPart parent, String id, IMemento memento) {
this.parent = parent;
this.id = id;
}
@Override
public void saveState(IMemento memento) {
}
@Override
public Control getControl() {
return container;
}
@Override
public String getId() {
return id;
}
@Override
public void setVisible(boolean visible) {
getControl().setVisible(visible);
}
@Override
public boolean hasFocusControl(Control control) {
return false;
}
@Override
public boolean fillContextMenu(IMenuManager manager) {
return false;
}
@Override
public IAction getGlobalAction(String id) {
return null;
}
@Override
public void stop() {
}
@Override
public void toggleRoleFilter() {
}
@Override
public void refilter() {
}
@Override
public void setFocus() {
indexText.setFocus();
}
public Text getTextWidget() {
return indexText;
}
}