/* * Copyright 2000-2014 JetBrains s.r.o. * * 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.intellij.ide.util; import com.intellij.ide.IdeBundle; import com.intellij.openapi.application.ex.ApplicationManagerEx; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.LogicalPosition; import com.intellij.openapi.editor.ScrollType; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import javax.swing.*; import java.awt.*; public class GotoLineNumberDialog extends DialogWrapper { private JTextField myField; private JTextField myOffsetField; private final Editor myEditor; public GotoLineNumberDialog(Project project, Editor editor){ super(project, true); myEditor = editor; setTitle(IdeBundle.message("title.go.to.line")); init(); } @Override protected void doOKAction(){ final LogicalPosition currentPosition = myEditor.getCaretModel().getLogicalPosition(); int lineNumber = getLineNumber(currentPosition.line + 1); if (isInternal() && myOffsetField.getText().length() > 0) { try { final int offset = Integer.parseInt(myOffsetField.getText()); if (offset < myEditor.getDocument().getTextLength()) { myEditor.getCaretModel().removeSecondaryCarets(); myEditor.getCaretModel().moveToOffset(offset); myEditor.getScrollingModel().scrollToCaret(ScrollType.CENTER); myEditor.getSelectionModel().removeSelection(); super.doOKAction(); } return; } catch (NumberFormatException e) { return; } } if (lineNumber < 0) return; int columnNumber = getColumnNumber(currentPosition.column); myEditor.getCaretModel().removeSecondaryCarets(); myEditor.getCaretModel().moveToLogicalPosition(new LogicalPosition(Math.max(0, lineNumber - 1), Math.max(0, columnNumber - 1))); myEditor.getScrollingModel().scrollToCaret(ScrollType.CENTER); myEditor.getSelectionModel().removeSelection(); super.doOKAction(); } private int getColumnNumber(int defaultValue) { String text = getText(); int columnIndex = columnSeparatorIndex(text); if (columnIndex == -1) return defaultValue; try { return Integer.parseInt(text.substring(columnIndex + 1)); } catch (NumberFormatException e) { return defaultValue; } } private static int columnSeparatorIndex(final String text) { final int colonIndex = text.indexOf(':'); return colonIndex >= 0 ? colonIndex : text.indexOf(','); } private int getLineNumber(int defaultLine) { try { String text = getText(); int columnIndex = columnSeparatorIndex(text); text = columnIndex == -1 ? text : text.substring(0, columnIndex); if (text.trim().length() == 0) return defaultLine; return Integer.parseInt(text); } catch (NumberFormatException e) { return -1; } } private static boolean isInternal() { return ApplicationManagerEx.getApplicationEx().isInternal(); } @Override public JComponent getPreferredFocusedComponent() { return myField; } @Override protected JComponent createCenterPanel() { return null; } private String getText() { return myField.getText(); } @Override protected JComponent createNorthPanel() { class MyTextField extends JTextField { public MyTextField() { super(""); } @Override public Dimension getPreferredSize() { Dimension d = super.getPreferredSize(); return new Dimension(200, d.height); } } JPanel panel = new JPanel(new GridBagLayout()); GridBagConstraints gbConstraints = new GridBagConstraints(); gbConstraints.insets = new Insets(4, 0, 8, 8); gbConstraints.fill = GridBagConstraints.VERTICAL; gbConstraints.weightx = 0; gbConstraints.weighty = 1; gbConstraints.anchor = GridBagConstraints.EAST; JLabel label = new JLabel(IdeBundle.message("editbox.line.number")); panel.add(label, gbConstraints); gbConstraints.fill = GridBagConstraints.BOTH; gbConstraints.weightx = 1; myField = new MyTextField(); panel.add(myField, gbConstraints); myField.setToolTipText(IdeBundle.message("tooltip.syntax.linenumber.columnnumber")); LogicalPosition position = myEditor.getCaretModel().getLogicalPosition(); myField.setText(String.format("%d:%d", position.line + 1, position.column + 1)); if (isInternal()) { gbConstraints.gridy = 1; gbConstraints.weightx = 0; gbConstraints.weighty = 1; gbConstraints.anchor = GridBagConstraints.EAST; final JLabel offsetLabel = new JLabel("Offset:"); panel.add(offsetLabel, gbConstraints); gbConstraints.fill = GridBagConstraints.BOTH; gbConstraints.weightx = 1; myOffsetField = new MyTextField(); panel.add(myOffsetField, gbConstraints); } return panel; } }