/* | |
* Copyright (C) 2012 The Android Open Source Project | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
package com.motorola.studio.android.codesnippets; | |
import java.util.Iterator; | |
import java.util.List; | |
import org.eclipse.jface.action.ControlContribution; | |
import org.eclipse.swt.SWT; | |
import org.eclipse.swt.widgets.Composite; | |
import org.eclipse.swt.widgets.Control; | |
import org.eclipse.swt.widgets.Event; | |
import org.eclipse.swt.widgets.Listener; | |
import org.eclipse.swt.widgets.Text; | |
import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteDrawer; | |
import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteItem; | |
import org.eclipse.wst.common.snippets.internal.ui.SnippetsView; | |
import com.motorola.studio.android.codesnippets.i18n.AndroidSnippetsNLS; | |
@SuppressWarnings("restriction") | |
public class SnippetsViewContributionItem extends ControlContribution | |
{ | |
private final SnippetsView view; | |
public SnippetsViewContributionItem(SnippetsView view) | |
{ | |
super("com.motorola.studio.android.codesnippets.search"); | |
this.view = view; | |
} | |
private Text text; | |
final String INITIAL_TEXT = AndroidSnippetsNLS.UI_Snippet_SearchLabel; | |
/* (non-Javadoc) | |
* @see org.eclipse.jface.action.ControlContribution#computeWidth(org.eclipse.swt.widgets.Control) | |
*/ | |
@Override | |
protected int computeWidth(Control control) | |
{ | |
return text.computeSize(100, SWT.DEFAULT).x; | |
} | |
@Override | |
protected Control createControl(Composite parent) | |
{ | |
text = new Text(parent, SWT.BORDER | SWT.SEARCH | SWT.ICON_SEARCH); | |
text.setToolTipText(INITIAL_TEXT); | |
text.setEnabled(true); | |
text.setEditable(true); | |
text.setMessage(INITIAL_TEXT); | |
resetView(); | |
text.addListener(SWT.Modify, new Listener() | |
{ | |
public void handleEvent(Event event) | |
{ | |
String typed = text.getText().toLowerCase(); | |
// variables for the first inner loop | |
Object rootChildObject = null; | |
SnippetPaletteDrawer snippetPaletteDrawer = null; | |
SnippetPaletteItem snippetPalletItem = null; | |
// variables for the second inner loop | |
List<?> snippetPalleteDrawerChildren = null; | |
Iterator<?> snippetPalleteDrawerIterator = null; | |
Integer foundItemsCount = null; | |
Integer lastIndex = null; | |
Object snippetPalletObject = null; | |
// get text and items to be sought in | |
List<?> rootChildren = view.getRoot().getChildren(); | |
Iterator<?> rootChildremIterator = rootChildren.iterator(); | |
/* Here the idea is to iterate through the snippets labels, text and codes, | |
* and find a match. In case there are results, a number of found items by category | |
* is displayed. | |
*/ | |
while (rootChildremIterator.hasNext()) | |
{ | |
rootChildObject = rootChildremIterator.next(); | |
if (rootChildObject instanceof SnippetPaletteDrawer) | |
{ | |
snippetPaletteDrawer = (SnippetPaletteDrawer) rootChildObject; | |
snippetPalleteDrawerChildren = snippetPaletteDrawer.getChildren(); | |
snippetPalleteDrawerIterator = snippetPalleteDrawerChildren.iterator(); | |
foundItemsCount = 0; | |
while (snippetPalleteDrawerIterator.hasNext()) | |
{ | |
snippetPalletObject = snippetPalleteDrawerIterator.next(); | |
if (snippetPalletObject instanceof SnippetPaletteItem) | |
{ | |
snippetPalletItem = (SnippetPaletteItem) snippetPalletObject; | |
// there must be a match for either the label, description or code of the snippet | |
if (snippetPalletItem.getLabel().toLowerCase().contains(typed) | |
|| snippetPalletItem.getDescription().toLowerCase() | |
.contains(typed) | |
|| snippetPalletItem.getContentString().toLowerCase() | |
.contains(typed)) | |
{ | |
snippetPalletItem.setVisible(true); | |
foundItemsCount++; | |
} | |
else | |
{ | |
// since no match was found for the snippets, try to find for its category label | |
if (snippetPaletteDrawer.getLabel().toLowerCase() | |
.contains(typed)) | |
{ | |
snippetPalletItem.setVisible(true); | |
foundItemsCount++; | |
} | |
else | |
{ | |
snippetPalletItem.setVisible(false); | |
} | |
} | |
} | |
} | |
// display the number of found items between parenthesis | |
lastIndex = snippetPaletteDrawer.getLabel().lastIndexOf(")"); | |
if (lastIndex == -1) | |
{ | |
snippetPaletteDrawer.setLabel(snippetPaletteDrawer.getLabel() + " (" | |
+ foundItemsCount + ")"); | |
} | |
else | |
{ | |
snippetPaletteDrawer.setLabel(snippetPaletteDrawer.getLabel() | |
.replaceFirst("\\(\\d+\\)", | |
"(" + foundItemsCount.toString() + ")")); | |
} | |
/* | |
* In case no match is found, hide the pallete and all | |
* its children, otherwise display the number of items | |
* found between parenthesis. | |
*/ | |
if (foundItemsCount == 0) | |
{ | |
snippetPaletteDrawer.setVisible(false); | |
snippetPaletteDrawer.setFilters(new String[] | |
{ | |
"!" | |
}); | |
} | |
else | |
{ | |
// show the item | |
snippetPaletteDrawer.setVisible(true); | |
snippetPaletteDrawer.setFilters(new String[] | |
{ | |
"*" | |
}); | |
} | |
} | |
} | |
} | |
}); | |
return text; | |
} | |
/** | |
* Set all items to be visible. | |
*/ | |
private void resetView() | |
{ | |
// get text and items to be sought in | |
List<?> rootChildren = view.getRoot().getChildren(); | |
Iterator<?> rootChildremIterator = rootChildren.iterator(); | |
/* | |
* Here the idea is to iterate through the snippets labels, text and codes, | |
* and set everything to visible, since the view is saving the state. | |
*/ | |
while (rootChildremIterator.hasNext()) | |
{ | |
Object rootChildObject = rootChildremIterator.next(); | |
if (rootChildObject instanceof SnippetPaletteDrawer) | |
{ | |
SnippetPaletteDrawer snippetPaletteDrawer = (SnippetPaletteDrawer) rootChildObject; | |
List<?> snippetPalleteDrawerChildren = snippetPaletteDrawer.getChildren(); | |
Iterator<?> snippetPalleteDrawerIterator = snippetPalleteDrawerChildren.iterator(); | |
snippetPaletteDrawer.setVisible(true); | |
while (snippetPalleteDrawerIterator.hasNext()) | |
{ | |
Object snippetPalletObject = snippetPalleteDrawerIterator.next(); | |
if (snippetPalletObject instanceof SnippetPaletteItem) | |
{ | |
SnippetPaletteItem snippetPalletItem = | |
(SnippetPaletteItem) snippetPalletObject; | |
snippetPalletItem.setVisible(true); | |
} | |
} | |
} | |
} | |
} | |
public void clean() | |
{ | |
text.setText(""); | |
} | |
} |