/** * Aptana Studio * Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the GNU Public License (GPL) v3 (with exceptions). * Please see the license.html included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ package com.aptana.editor.php.internal.ui.dialog; import java.util.Collection; import java.util.Comparator; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.dialogs.SearchPattern; import org2.eclipse.php.core.compiler.PHPFlags; import com.aptana.editor.php.PHPEditorPlugin; import com.aptana.editor.php.indexer.IIndexChangeListener; import com.aptana.editor.php.internal.search.IElementNode; import com.aptana.editor.php.internal.search.ITypeNode; import com.aptana.editor.php.internal.search.PHPSearchEngine; import com.aptana.editor.php.internal.ui.editor.outline.PHPOutlineLabelProvider; /** * @author Pavel Petrochenko */ public class TypeSelectionDialog extends CustomFilteredItemsSelectionDialog { /** * @author Pavel Petrochenko */ public static final class TypeLabelProvider extends LabelProvider { /* * (non-Javadoc) * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object) */ public Image getImage(Object element) { if (element instanceof ITypeNode) { ITypeNode node = (ITypeNode) element; if (node.getKind() == IElementNode.TRAIT) { return PHPOutlineLabelProvider.TRAIT_ICON; } else { int modifiers = node.getModifiers(); if (PHPFlags.isInterface(modifiers)) { return PHPOutlineLabelProvider.INTERFACE_ICON; } return PHPOutlineLabelProvider.CLASS_ICON; } } if (element instanceof IElementNode) { IElementNode nm = (IElementNode) element; if (nm.getKind() == IElementNode.FUNCTION) { return PHPOutlineLabelProvider.FUNCTION_ICON; } if (nm.getKind() == IElementNode.CONSTANT) { return PHPOutlineLabelProvider.LOCALVARIABLE_ICON; } } return super.getImage(element); } /* * (non-Javadoc) * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object) */ public String getText(Object element) { if (element instanceof IElementNode) { IElementNode node = (IElementNode) element; return node.getName() + " - " + node.getPath(); //$NON-NLS-1$ } return super.getText(element); } } private IProject project; /** * @return current project */ public IProject getProject() { return project; } /** * @param project */ public void setProject(IProject project) { this.project = project; } private boolean allowInterfaces = true; /** * @return allow classes */ public boolean isAllowInterfaces() { return allowInterfaces; } /** * @param allowInterfaces */ public void setAllowInterfaces(boolean allowInterfaces) { this.allowInterfaces = allowInterfaces; } /** * @return allow interfaces */ public boolean isAllowClasses() { return allowClasses; } /** * @param allowClasses */ public void setAllowClasses(boolean allowClasses) { this.allowClasses = allowClasses; } private boolean allowClasses = true; /** * Constructs a new TypeSelectionDialog * * @param shell * @param multi */ public TypeSelectionDialog(Shell shell, boolean multi) { super(shell, multi); setDetailsLabelProvider(new LabelProvider() { public Image getImage(Object element) { if (element instanceof IElementNode) { return PHPOutlineLabelProvider.BLOCK_ICON; } return super.getImage(element); } public String getText(Object element) { if (element instanceof IElementNode) { IElementNode node = (IElementNode) element; return node.getPath(); } return super.getText(element); } }); setListLabelProvider(new TypeLabelProvider()); } /* * (non-Javadoc) * @see * com.aptana.editor.php.internal.ui.dialog.CustomFilteredItemsSelectionDialog#createExtendedContentArea(org.eclipse * .swt.widgets.Composite) */ protected Control createExtendedContentArea(Composite parent) { return null; } private IIndexChangeListener listener = new IIndexChangeListener() { public void stateChanged(boolean done, String message) { if (done) { getShell().getDisplay().asyncExec(new Runnable() { public void run() { refreshContent(); } }); } } public void changeProcessed() { } }; /* * (non-Javadoc) * @see com.aptana.editor.php.internal.ui.dialog.CustomFilteredItemsSelectionDialog#create() */ public void create() { super.create(); PHPSearchEngine.getInstance().addListener(listener); setHelpAvailable(false); // PlatformUI.getWorkbench().getHelpSystem().setHelp(getContents(), "com.aptana.editor.php.open_type"); //$NON-NLS-1$ } /* * (non-Javadoc) * @see com.aptana.editor.php.internal.ui.dialog.CustomFilteredItemsSelectionDialog#close() */ public boolean close() { PHPSearchEngine.getInstance().removeListener(listener); return super.close(); } /* * (non-Javadoc) * @see com.aptana.editor.php.internal.ui.dialog.CustomFilteredItemsSelectionDialog#createFilter() */ protected ItemsFilter createFilter() { Text txt = (Text) getPatternControl(); final String text = txt.getText(); SearchPattern searchPattern = new SearchPattern(); searchPattern.setPattern(text); ItemsFilter itemsFilter = new ItemsFilter(searchPattern) { public boolean isConsistentItem(Object item) { return true; } public boolean matchItem(Object item) { if (item instanceof ITypeNode) { ITypeNode node = (ITypeNode) item; if (!isAllowClasses()) { if (!PHPFlags.isInterface(node.getModifiers())) { return false; } } if (!isAllowInterfaces()) { if (PHPFlags.isInterface(node.getModifiers())) { return false; } } if (project != null) { if (!node.isOnBuildPath(project)) { return false; } } if (text.length() == 0) { return true; } } return super.matches(getElementName(item)); } }; return itemsFilter; } /* * (non-Javadoc) * @see * com.aptana.editor.php.internal.ui.dialog.CustomFilteredItemsSelectionDialog#fillContentProvider(com.aptana.editor * .php.internal.ui.dialog.CustomFilteredItemsSelectionDialog.AbstractContentProvider, * com.aptana.editor.php.internal.ui.dialog.CustomFilteredItemsSelectionDialog.ItemsFilter, * org.eclipse.core.runtime.IProgressMonitor) */ protected void fillContentProvider(AbstractContentProvider contentProvider, ItemsFilter itemsFilter, IProgressMonitor progressMonitor) throws CoreException { Collection<?> allKnownTypes = PHPSearchEngine.getInstance().getAllKnownTypes(); for (Object o : allKnownTypes) { contentProvider.add(o, itemsFilter); } } /* * (non-Javadoc) * @see com.aptana.editor.php.internal.ui.dialog.CustomFilteredItemsSelectionDialog#getDialogSettings() */ protected IDialogSettings getDialogSettings() { return PHPEditorPlugin.getDefault().getDialogSettings(); } /* * (non-Javadoc) * @see com.aptana.editor.php.internal.ui.dialog.CustomFilteredItemsSelectionDialog#getElementName(java.lang.Object) */ public String getElementName(Object item) { IElementNode node = (IElementNode) item; return node.getName(); } /* * (non-Javadoc) * @see com.aptana.editor.php.internal.ui.dialog.CustomFilteredItemsSelectionDialog#getItemsComparator() */ @SuppressWarnings({ "rawtypes", "unchecked" }) protected Comparator getItemsComparator() { return new Comparator<IElementNode>() { public int compare(IElementNode o1, IElementNode o2) { int compareTo = o1.getName().compareTo(o2.getName()); if (compareTo == 0) { return o1.getPath().compareTo(o2.getPath()); } return compareTo; } }; } /* * (non-Javadoc) * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#validateItem(java.lang.Object) */ protected IStatus validateItem(Object item) { return Status.OK_STATUS; } }