/*
* Copyright 2014 Dart project authors.
*
* Licensed under the Eclipse Public License v1.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.eclipse.org/legal/epl-v10.html
*
* 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.google.dart.tools.tests.swtbot.model;
import com.xored.glance.internal.ui.GlancePlugin;
import com.xored.glance.internal.ui.panels.SearchPanelManager;
import com.xored.glance.internal.ui.preferences.IPreferenceConstants;
import com.xored.glance.ui.panels.ISearchPanel;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
import org.eclipse.swtbot.swt.finder.finders.ControlFinder;
import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
import org.eclipse.swtbot.swt.finder.matchers.WidgetOfType;
import org.eclipse.swtbot.swt.finder.results.StringResult;
import org.eclipse.swtbot.swt.finder.results.VoidResult;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotCLabel;
import org.hamcrest.Matcher;
import java.util.List;
public class FindTextBotView extends AbstractBotView {
private static final int WAIT_TIME = 300;
public FindTextBotView(SWTWorkbenchBot bot) {
super(bot);
}
/**
* Close the search panel.
*/
public void dismiss() {
UIThreadRunnable.syncExec(new VoidResult() {
@Override
public void run() {
getPanel().closePanel();
}
});
}
/**
* Select the next match. Does not re-index but does update search status.
*/
public void findNext() {
UIThreadRunnable.syncExec(new VoidResult() {
@Override
public void run() {
getPanel().findNext();
}
});
waitForAsyncDrain();
}
/**
* Select the previous match. Does not re-index but does update search status.
*/
public void findPrevious() {
UIThreadRunnable.syncExec(new VoidResult() {
@Override
public void run() {
getPanel().findPrevious();
}
});
waitForAsyncDrain();
}
/**
* Search for the given <code>text</code>. This causes re-indexing, which will update the search
* status.
*
* @param text the string the find
*/
public void findText(final String text) {
UIThreadRunnable.syncExec(new VoidResult() {
@Override
public void run() {
getCombo().setText(text);
}
});
// There's no way to tell that the search has finished
waitMillis(WAIT_TIME);
waitForAsyncDrain();
}
/**
* Get the search status string, which shows the number of matches and which one is currently
* selected, if any.
*
* @return the search status string
*/
public String getSearchStatus() {
return UIThreadRunnable.syncExec(new StringResult() {
@Override
public String run() {
return getSearchStatusLabel().getText();
}
});
}
/**
* Set the preference that determines if searching is case-sensitive or not to the given
* <code>value</code>. This causes re-indexing, which will update the search status.
*
* @param value <code>true</code> if searching should be case sensitive.
*/
public void setCaseSensitiveSearch(final boolean value) {
UIThreadRunnable.syncExec(new VoidResult() {
@Override
public void run() {
IPreferenceStore preferences = GlancePlugin.getDefault().getPreferenceStore();
preferences.setValue(IPreferenceConstants.SEARCH_CASE_SENSITIVE, value);
}
});
waitMillis(WAIT_TIME);
waitForAsyncDrain();
}
/**
* Set the preference that determines if the search string should be interpreted as a regular
* expression or not to the given <code>value</code>. This causes re-indexing, which will update
* the search status.
*
* @param value <code>true</code> if searching should use regular expression rules.
*/
public void setRegexpSearch(final boolean value) {
UIThreadRunnable.syncExec(new VoidResult() {
@Override
public void run() {
IPreferenceStore preferences = GlancePlugin.getDefault().getPreferenceStore();
preferences.setValue(IPreferenceConstants.SEARCH_REGEXP, value);
}
});
waitMillis(WAIT_TIME);
waitForAsyncDrain();
}
/**
* Set the preference that determines if searching only matches the string at the beginning of a
* word or not to the given <code>value</code>. This causes re-indexing, which will update the
* search status.
*
* @param value <code>true</code> if searching should match word-beginnings only.
*/
public void setWordPrefixSearch(final boolean value) {
UIThreadRunnable.syncExec(new VoidResult() {
@Override
public void run() {
IPreferenceStore preferences = GlancePlugin.getDefault().getPreferenceStore();
preferences.setValue(IPreferenceConstants.SEARCH_WORD_PREFIX, value);
}
});
waitMillis(WAIT_TIME);
waitForAsyncDrain();
}
@Override
protected String viewName() {
return "FindText";
}
private Combo getCombo() {
// Must run on UI thread.
Composite parent = (Composite) getPanel().getControl();
Matcher<Combo> matcher = WidgetOfType.widgetOfType(Combo.class);
List<Combo> list = new ControlFinder().findControls(parent, matcher, true);
if (list.isEmpty()) {
return null;
}
return list.get(0);
}
private ISearchPanel getPanel() {
// Must run on UI thread.
return SearchPanelManager.getInstance().getPanel(bot.getFocusedWidget());
}
private SWTBotCLabel getSearchStatusLabel() {
// Must run on UI thread.
return bot.clabelWithId("name", "searchStatus");
}
}