001: /*******************************************************************************
002: * Copyright (c) 2000, 2006 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.ui.console.actions;
011:
012: import com.ibm.icu.text.MessageFormat;
013:
014: import org.eclipse.jface.dialogs.IInputValidator;
015: import org.eclipse.jface.dialogs.InputDialog;
016: import org.eclipse.jface.text.BadLocationException;
017: import org.eclipse.jface.text.IDocument;
018: import org.eclipse.jface.text.ITextViewer;
019: import org.eclipse.jface.window.Window;
020: import org.eclipse.swt.graphics.Point;
021: import org.eclipse.swt.widgets.Shell;
022: import org.eclipse.ui.console.ConsolePlugin;
023: import org.eclipse.ui.internal.console.ConsoleMessages;
024:
025: /**
026: * Action to position a text viewer to a specific line.
027: * <p>
028: * Clients may instantiate this class; this class is not intended to
029: * be subclassed.
030: * </p>
031: * @since 3.0
032: */
033: public class TextViewerGotoLineAction extends TextViewerAction {
034:
035: /**
036: * Validates whether the text found in the input field of the
037: * dialog forms a valid line number, i.e. one to which can be
038: * jumped.
039: */
040: class NumberValidator implements IInputValidator {
041:
042: public String isValid(String input) {
043: try {
044: int i = Integer.parseInt(input);
045: if (i <= 0 || fLastLine < i)
046: return ConsoleMessages.TextViewerGotoLineAction_Line_number_out_of_range_1;
047:
048: } catch (NumberFormatException x) {
049: return ConsoleMessages.TextViewerGotoLineAction_Not_a_number_2;
050: }
051:
052: return null;
053: }
054: }
055:
056: protected int fLastLine;
057: protected ITextViewer fTextViewer;
058:
059: /**
060: * Constructs a goto line action for the viewer using the provided resource bundle
061: */
062: public TextViewerGotoLineAction(ITextViewer viewer) {
063: super (viewer, -1);
064: fTextViewer = viewer;
065: setText(ConsoleMessages.TextViewerGotoLineAction_Go_to__Line____Ctrl_L_4);
066: setToolTipText(ConsoleMessages.TextViewerGotoLineAction_Go_To_Line_1);
067: setDescription(ConsoleMessages.TextViewerGotoLineAction_Go_To_Line_1);
068: }
069:
070: /**
071: * @see TextViewerAction#update()
072: */
073: public void update() {
074: }
075:
076: /**
077: * Jumps to the line.
078: */
079: protected void gotoLine(int line) {
080:
081: IDocument document = fTextViewer.getDocument();
082: try {
083: int start = document.getLineOffset(line);
084: int length = document.getLineLength(line);
085: fTextViewer.getTextWidget().setSelection(start,
086: start + length);
087: fTextViewer.revealRange(start, length);
088: } catch (BadLocationException x) {
089: ConsolePlugin
090: .errorDialog(
091: fTextViewer.getTextWidget().getShell(),
092: ConsoleMessages.TextViewerGotoLineAction_Go_To_Line_1,
093: ConsoleMessages.TextViewerGotoLineAction_Exceptions_occurred_attempt_to_go_to_line_2,
094: x); //
095: }
096: }
097:
098: /* (non-Javadoc)
099: * @see org.eclipse.jface.action.IAction#run()
100: */
101: public void run() {
102: try {
103: Point selection = fTextViewer.getTextWidget()
104: .getSelection();
105: IDocument document = fTextViewer.getDocument();
106: fLastLine = document.getLineOfOffset(document.getLength()) + 1;
107: int startLine = selection == null ? 1 : fTextViewer
108: .getTextWidget().getLineAtOffset(selection.x) + 1;
109: String title = ConsoleMessages.TextViewerGotoLineAction_Go_To_Line_1;
110: String message = MessageFormat
111: .format(
112: ConsoleMessages.TextViewerGotoLineAction_Enter_line_number__8,
113: new Object[] { new Integer(fLastLine) });
114: String value = Integer.toString(startLine);
115: Shell activeShell = fTextViewer.getTextWidget().getShell();
116: InputDialog d = new InputDialog(activeShell, title,
117: message, value, new NumberValidator());
118: if (d.open() == Window.OK) {
119: try {
120: int line = Integer.parseInt(d.getValue());
121: gotoLine(line - 1);
122: } catch (NumberFormatException x) {
123: ConsolePlugin
124: .errorDialog(
125: activeShell,
126: ConsoleMessages.TextViewerGotoLineAction_Go_To_Line_1,
127: ConsoleMessages.TextViewerGotoLineAction_Exceptions_occurred_attempt_to_go_to_line_2,
128: x); //
129: }
130: }
131: } catch (BadLocationException x) {
132: ConsolePlugin
133: .errorDialog(
134: fTextViewer.getTextWidget().getShell(),
135: ConsoleMessages.TextViewerGotoLineAction_Go_To_Line_1,
136: ConsoleMessages.TextViewerGotoLineAction_Exceptions_occurred_attempt_to_go_to_line_2,
137: x); //
138: return;
139: }
140: }
141: }
|