// Copyright 2012 Google Inc. All Rights Reserved.
//
// 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.google.collide.client.search.awesomebox;
import com.google.collide.client.code.FileSelectionController.FileOpenedEvent;
import com.google.collide.client.editor.Editor;
import com.google.collide.client.history.Place;
import com.google.collide.client.search.awesomebox.AbstractActionSection.FilteredActionItem;
import com.google.collide.client.search.awesomebox.AwesomeBox.Resources;
import com.google.collide.client.util.PathUtil;
import com.google.collide.client.util.input.ModifierKeys;
import com.google.collide.json.shared.JsonArray;
import com.google.collide.shared.util.JsonCollections;
import com.google.common.base.Preconditions;
import com.google.gwt.regexp.shared.MatchResult;
import com.google.gwt.regexp.shared.RegExp;
/**
* An AwesomeBox section which is responsible for presenting the user with
* possible actions which affect the current editor document.
*/
public class GotoActionSection extends AbstractActionSection<FilteredActionItem> {
/**
* The maximum number of results to display when filtering.
*/
public static final int MAX_RESULTS = 3;
private Editor editor;
private boolean isEditableFileOpened = false;
/**
* Instantiates a new EditorActionSection
*/
public GotoActionSection(Resources res) {
super(res, MAX_RESULTS);
}
/**
* Attach the editor to this awesome box section.
*
* @param editor The Collide editor .
*/
public void attachEditorAndPlace(Place place, Editor editor) {
this.editor = editor;
place.registerSimpleEventHandler(FileOpenedEvent.TYPE, new FileOpenedEvent.Handler() {
@Override
public void onFileOpened(boolean isEditable, PathUtil filePath) {
isEditableFileOpened = isEditable;
}
});
}
@Override
public boolean onQueryChanged(String query) {
if (!isEditableFileOpened) {
return false;
}
return super.onQueryChanged(query);
}
@Override
public boolean onShowing(AwesomeBox awesomebox) {
// no reason to call up to our parent, we don't show.
return false;
}
@Override
protected JsonArray<FilteredActionItem> getAllActions() {
JsonArray<FilteredActionItem> actions = JsonCollections.createArray();
actions.add(new FilteredActionItem(res, "goto line #", ModifierKeys.ACTION, "g") {
private RegExp numbers = RegExp.compile("(\\d+)");
private String lastQuery;
@Override
public boolean onQueryChanged(String query) {
if (numbers.test(query)) {
String number = numbers.exec(query).getGroup(1);
getElement().setTextContent("goto line " + number);
lastQuery = query;
// TODO: An actual disabled style
getElement().getStyle().setColor("black");
return true;
}
// we defer to testing our goto line label
getElement().setTextContent("goto line #");
lastQuery = "";
getElement().getStyle().setColor("gray");
return super.onQueryChanged(query);
}
@Override
public boolean onShowing() {
return false;
}
@Override
public ActionResult doAction(ActionSource source) {
Preconditions.checkNotNull(editor, "Editor cannot be null");
MatchResult match = numbers.exec(lastQuery);
// if the user clicks us without specifying a line
if (match == null) {
return ActionResult.DO_NOTHING;
}
int line = Integer.parseInt(match.getGroup(1));
int realLine = Math.min(editor.getDocument().getLineCount() - 1, Math.max(line - 1, 0));
editor.scrollTo(realLine, 0);
editor.getFocusManager().focus();
return ActionResult.CLOSE;
}
});
actions.add(new FilteredActionItem(res, "goto top") {
@Override
public ActionResult doAction(ActionSource source) {
Preconditions.checkNotNull(editor, "Editor cannot be null");
editor.scrollTo(0, 0);
editor.getFocusManager().focus();
return ActionResult.CLOSE;
}
@Override
public boolean onShowing() {
return false;
}
});
actions.add(new FilteredActionItem(res, "goto end") {
@Override
public ActionResult doAction(ActionSource source) {
Preconditions.checkNotNull(editor, "Editor cannot be null");
editor.scrollTo(editor.getDocument().getLineCount() - 1, 0);
editor.getFocusManager().focus();
return ActionResult.CLOSE;
}
@Override
public boolean onShowing() {
return false;
}
});
return actions;
}
@Override
protected String getTitle() {
return "Goto";
}
}