/******************************************************************************* * Copyright (c) 2009 IBM 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: * IBM Corporation - initial API and implementation * Zend Technologies *******************************************************************************/ package org.eclipse.php.internal.ui.dialogs.openType.generic; import org.eclipse.jface.viewers.*; import org.eclipse.php.internal.ui.PHPUIMessages; import org.eclipse.php.internal.ui.dialogs.openType.generic.filter.ElementSpecificFilter; import org.eclipse.php.internal.ui.dialogs.openType.generic.filter.IFilter; import org.eclipse.php.internal.ui.util.SearchPattern; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; public class BasicSelector extends Composite { private Label instructionLabel; private Text filterText; private Label matchingLabel; private HighLoadTableViewer tableViewer; private Composite tableViewerComposite; private CompositeFactory contentAreaCompositeFactory; private ViewerElementFilter phpTypeViewerFilter; private IBasicSelectorLabelProvider basicSelectorLabelProvider; public BasicSelector(Composite parent, CompositeFactory contentAreaCompositeFactory) { super(parent, SWT.NONE); this.contentAreaCompositeFactory = new CompositeFactoryAsserter(contentAreaCompositeFactory); initialize(); } public void setInitFilterText(String initFilterText) { filterText.setText(initFilterText); } private void initialize() { FormLayout formLayout = new FormLayout(); formLayout.marginWidth = 10; formLayout.marginHeight = 5; this.setLayout(formLayout); initControls(); this.setSize(new org.eclipse.swt.graphics.Point(341, 400)); } private void initControls() { this.createInstructionLabel(); FormData formData = new FormData(); instructionLabel.setLayoutData(formData); formData.top = new FormAttachment(0); this.createFilterText(); formData = new FormData(); filterText.setLayoutData(formData); formData.top = new FormAttachment(instructionLabel, 5); formData.left = new FormAttachment(0); formData.right = new FormAttachment(100); Control lastControl = filterText; if (contentAreaCompositeFactory != null) { Composite contentFilterComposite = contentAreaCompositeFactory.createComposite(this); lastControl = contentFilterComposite; formData = new FormData(); contentFilterComposite.setLayoutData(formData); formData.top = new FormAttachment(filterText, 5); formData.left = new FormAttachment(0); formData.right = new FormAttachment(100); } this.createMatchingLabel(); formData = new FormData(); this.matchingLabel.setLayoutData(formData); formData.top = new FormAttachment(lastControl, 5); formData.left = new FormAttachment(0); formData.right = new FormAttachment(100); this.createTableViewer(); formData = new FormData(); this.tableViewerComposite.setLayoutData(formData); formData.top = new FormAttachment(matchingLabel, 5); formData.left = new FormAttachment(0); formData.right = new FormAttachment(100); formData.bottom = new FormAttachment(100); } private void createTableViewer() { tableViewerComposite = new Composite(this, SWT.NONE); FillLayout fillLayout = new FillLayout(); tableViewerComposite.setLayout(fillLayout); tableViewer = new HighLoadTableViewer(tableViewerComposite, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); phpTypeViewerFilter = new ViewerElementFilter(); tableViewer.addFilter(phpTypeViewerFilter); // Functionality to go to the text when pressing the up arrow and found // in the first element tableViewer.getControl().addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { StructuredSelection structuredSelection = (StructuredSelection) tableViewer.getSelection(); if (structuredSelection.getFirstElement() == tableViewer.getElementAt(0) && SWT.ARROW_UP == e.keyCode) { filterText.setFocus(); } } }); tableViewer.getControl().addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { if ((e.keyCode & SWT.KEYCODE_BIT) == 0) { if ((e.keyCode > 'a' && e.keyCode < 'z') || (e.keyCode > 'A' && e.keyCode < 'Z')) { filterText.setFocus(); filterText.setText(filterText.getText() + e.character); filterText.setSelection(filterText.getText().length()); } else if (e.keyCode == SWT.BS) { filterText.setFocus(); String text = filterText.getText(); if (text.length() == 0) { return; } filterText.setText(text.substring(0, text.length() - 1)); filterText.setSelection(text.length() - 1); } } } }); } private void createMatchingLabel() { matchingLabel = new Label(this, SWT.NONE); matchingLabel.setText(PHPUIMessages.OpenType_matchingResources); } private void createFilterText() { this.filterText = new Text(this, SWT.BORDER); filterText.addModifyListener(e -> phpTypeViewerFilter.setFilterText(filterText.getText())); // When pressing the down arrow and found in the text, the focus is // changed for the table filterText.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { if (SWT.ARROW_DOWN == e.keyCode && tableViewer.getTableElements().length != 0) { tableViewer.getControl().setFocus(); } } }); } private void createInstructionLabel() { instructionLabel = new Label(this, SWT.NONE); instructionLabel.setText(PHPUIMessages.OpenType_instructionText); } public void setElements(Object[] elements) { tableViewer.setElements(elements); } public void setLabelProvider(IBasicSelectorLabelProvider basicSelectorLabelProvider) { this.basicSelectorLabelProvider = basicSelectorLabelProvider; this.tableViewer.setLabelProvider(new ITableLabelProvider() { @Override public Image getColumnImage(Object element, int columnIndex) { return BasicSelector.this.basicSelectorLabelProvider.getElementImage(element); } @Override public String getColumnText(Object element, int columnIndex) { return BasicSelector.this.basicSelectorLabelProvider.getElementDescription(element); } @Override public void addListener(ILabelProviderListener listener) { } @Override public void dispose() { } @Override public boolean isLabelProperty(Object element, String property) { return false; } @Override public void removeListener(ILabelProviderListener listener) { } }); } public void addFilter(final IFilter filter) { tableViewer.addFilter(filter); } private class ViewerElementFilter extends ElementSpecificFilter { private String textFilter = ""; //$NON-NLS-1$ @Override public boolean select(Object element) { if (textFilter.equals("")) { //$NON-NLS-1$ return false; } String elementText = BasicSelector.this.basicSelectorLabelProvider.getElementName(element).toLowerCase(); return SearchPattern.match(textFilter, elementText); } public void setFilterText(String textFilter) { this.textFilter = textFilter.toLowerCase(); notifyFilterChanged(); } } public Object getSelectedElement() { return ((StructuredSelection) tableViewer.getSelection()).getFirstElement(); } public void addDoubleClickListener(IDoubleClickListener listener) { tableViewer.addDoubleClickListener(listener); } public void addSelectionChangedListener(ISelectionChangedListener listener) { tableViewer.addSelectionChangedListener(listener); } public void setDefaultElementSelection(boolean defaultElementSelection) { tableViewer.setDefaultElementSelection(defaultElementSelection); } public void close() { tableViewer.close(); } }