Update of /cvsroot/squirrel-sql/sql12/plugins/syntax/src/net/sourceforge/squirrel_sql/plugins/syntax/rsyntax/search
In directory sfp-cvsdas-3.v30.ch3.sourceforge.com:/tmp/cvs-serv1806/plugins/syntax/src/net/sourceforge/squirrel_sql/plugins/syntax/rsyntax/search
Added Files:
SquirrelGoToDialog.java SearchDialogClosingListener.java
CaretState.java SquirrelRSyntaxSearchEngine.java
SquirrelReplaceDialog.java I18NStrings.properties
ISquirrelSearchDialog.java SearchDialogState.java
SquirrelFindDialog.java
Log Message:
RSyntax editor integration
--- NEW FILE: I18NStrings.properties ---
syntax.SquirrelRSyntaxSearchEngine.noMatchRestart=No match found.\nStart from begin?
syntax.SquirrelRSyntaxSearchEngine.noMatch=No match found.
syntax.SquirrelRSyntaxSearchEngine.RegExErrMsg=Invalid regular expression:\n{0}\nPlease check your regular expression search string.
syntax.SquirrelRSyntaxSearchEngine.RegExErrTitle=Regular expression error
syntax.SquirrelRSyntaxSearchEngine.countOccurencesReplaced={0} occurences replaced
SquirrelRSyntaxSearchEngine.findUsageHint=Find tips: shift F3: Find selected. F3: Repeat last find. control shift F3: Mark selected. escape: Unmark all
syntax.SquirrelRSyntaxSearchEngine.InvalidLineNumber=Invalid line number.
syntax.SquirrelGoToDialog.LineNumber=Line number
syntax.SquirrelGoToDialog.OKButtonLabel=OK
syntax.SquirrelGoToDialog.OKButtonMnemonic=O
syntax.SquirrelGoToDialog.Cancel=Cancel
syntax.SquirrelGoToDialog.CancelMnemonic=C
syntax.SquirrelGoToDialog.GotoDialogTitle=Go to line
syntax.SquirrelGoToDialog.LineNumberRange=Line number out of range\nMaximum line number is: {0}.
syntax.SquirrelGoToDialog.ErrorDialogTitle=Invalid line number
--- NEW FILE: SquirrelReplaceDialog.java ---
package net.sourceforge.squirrel_sql.plugins.syntax.rsyntax.search;
import net.sourceforge.squirrel_sql.client.gui.mainframe.MainFrame;
import org.fife.ui.search.ReplaceDialog;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.HashMap;
public class SquirrelReplaceDialog extends ReplaceDialog implements ISquirrelSearchDialog
{
private ArrayList<SearchDialogClosingListener> _closingListeners = new ArrayList<SearchDialogClosingListener>();
private HashMap<ActionListener, ActionListener> _listener_listenerProxy = new HashMap<ActionListener, ActionListener>();
public SquirrelReplaceDialog(MainFrame mainFrame)
{
super(mainFrame, null /* This ActionListener is not used, propably a bug in RText*/);
cancelButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
close();
}
});
addWindowListener(new WindowAdapter()
{
@Override
public void windowClosing(WindowEvent e)
{
fireClosing();
}
});
}
@Override
protected void escapePressed()
{
fireClosing();
super.escapePressed();
}
@Override
public void close()
{
fireClosing();
setVisible(false);
dispose();
}
private void fireClosing()
{
SearchDialogClosingListener[] listeners = _closingListeners.toArray(new SearchDialogClosingListener[_closingListeners.size()]);
for (SearchDialogClosingListener listener : listeners)
{
listener.searchDialogClosing();
}
}
@Override
public boolean isMatchCase()
{
return caseCheckBox.isSelected();
}
@Override
public boolean isWholeWord()
{
return wholeWordCheckBox.isSelected();
}
@Override
public boolean isRegExp()
{
return regExpCheckBox.isSelected();
}
@Override
public boolean isSearchUp()
{
return upButton.isSelected();
}
@Override
public boolean isMarkAll()
{
return markAllCheckBox.isSelected();
}
@Override
public JDialog getDialog()
{
return this;
}
@Override
public void addClosingListener(SearchDialogClosingListener l)
{
_closingListeners.add(l);
}
@Override
public void removeClosingListener(SearchDialogClosingListener l)
{
_closingListeners.remove(l);
}
@Override
public void addFindActionListener(ActionListener actionListener)
{
findNextButton.addActionListener(actionListener);
}
@Override
public void removeFindActionListener(ActionListener actionListener)
{
findNextButton.removeActionListener(actionListener);
}
@Override
public void addReplaceActionListener(final ActionListener actionListener)
{
ActionListener actionListenerProxy = new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
onReplace(e, actionListener);
}
};
addActionListener(actionListenerProxy);
_listener_listenerProxy.put(actionListener, actionListenerProxy);
}
///////////////////////////////////////////////////////////////////////////////////
// Only the action command decides if the replace odr replace all button was hit.
// The design in RText is an bit funny at this point
private void onReplace(ActionEvent e, ActionListener actionListener)
{
if("Replace".equals(e.getActionCommand()))
{
actionListener.actionPerformed(e);
}
}
private void onReplaceAll(ActionEvent e, ActionListener actionListener)
{
if("ReplaceAll".equals(e.getActionCommand()))
{
actionListener.actionPerformed(e);
}
}
//
///////////////////////////////////////////////////////////////////////////////////
@Override
public void removeReplaceActionListener(ActionListener actionListener)
{
removeReplaceListener(actionListener);
}
private void removeReplaceListener(ActionListener actionListener)
{
ActionListener actionListenerProxy = _listener_listenerProxy.remove(actionListener);
if(null != actionListenerProxy)
{
removeActionListener(actionListenerProxy);
}
}
@Override
public void addReplaceAllActionListener(final ActionListener actionListener)
{
ActionListener actionListenerProxy = new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
onReplaceAll(e, actionListener);
}
};
addActionListener(actionListenerProxy);
_listener_listenerProxy.put(actionListener, actionListenerProxy);
}
@Override
public void removeReplaceAllActionListener(ActionListener actionListener)
{
removeReplaceListener(actionListener);
}
}
--- NEW FILE: SquirrelRSyntaxSearchEngine.java ---
package net.sourceforge.squirrel_sql.plugins.syntax.rsyntax.search;
import net.sourceforge.squirrel_sql.client.session.ISession;
import net.sourceforge.squirrel_sql.plugins.syntax.rsyntax.SquirrelRSyntaxTextArea;
import net.sourceforge.squirrel_sql.fw.util.StringManager;
import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
import org.fife.ui.rtextarea.SearchEngine;
import javax.swing.*;
import javax.swing.text.BadLocationException;
import java.awt.event.*;
import java.util.Vector;
import java.util.regex.PatternSyntaxException;
public class SquirrelRSyntaxSearchEngine
{
private static final StringManager s_stringMgr =
StringManagerFactory.getStringManager(SquirrelRSyntaxSearchEngine.class);
private ISession _session;
private SquirrelRSyntaxTextArea _squirrelRSyntaxTextArea;
private ISquirrelSearchDialog _dialog;
private boolean _foundAtLeastOne;
private String _lastSearchString;
private CaretState _storedCaretState;
private SearchDialogState _storedSearchDialogState;
public SquirrelRSyntaxSearchEngine(ISession session, SquirrelRSyntaxTextArea squirrelRSyntaxTextArea)
{
_session = session;
_squirrelRSyntaxTextArea = squirrelRSyntaxTextArea;
}
public void find(ActionEvent squirrelEvt)
{
_session.getApplication().getMessageHandler().showMessage(s_stringMgr.getString("SquirrelRSyntaxSearchEngine.findUsageHint"));
search(squirrelEvt, false);
}
public void replace(ActionEvent squirrelEvt)
{
search(squirrelEvt, true);
}
public void search(ActionEvent squirrelEvt, boolean replace)
{
if(null != _dialog)
{
_dialog.requestFocus();
return;
}
if (replace)
{
_dialog = new SquirrelReplaceDialog(_session.getApplication().getMainFrame());
}
else
{
_dialog = new SquirrelFindDialog(_session.getApplication().getMainFrame());
}
_dialog.addFindActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
onFind();
}
});
_dialog.addReplaceActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
onReplace();
}
});
_dialog.addReplaceAllActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
onReplaceAll();
}
});
Vector<String> comboBoxStrings = new Vector<String>();
if(null != _lastSearchString)
{
comboBoxStrings.add(_lastSearchString);
}
(_dialog).setSearchParameters(comboBoxStrings, false, false, false, false, false);
String selectedText = _squirrelRSyntaxTextArea.getSelectedText();
if (null != selectedText)
{
_dialog.setSearchString(selectedText);
}
_dialog.setVisible(true);
_dialog.addClosingListener(new SearchDialogClosingListener(){
@Override
public void searchDialogClosing()
{
onDialogClosing();
}
});
storeCaretState();
_foundAtLeastOne = false;
}
private void onReplaceAll()
{
_lastSearchString = _dialog.getSearchString();
int count = SearchEngine.replaceAll(_squirrelRSyntaxTextArea, _lastSearchString,
_dialog.getReplaceString(),
_dialog.isMatchCase(), _dialog.isWholeWord(), _dialog.isRegExp());
if (_dialog.isMarkAll() && null != _dialog.getReplaceString() && 0 < _dialog.getReplaceString().length())
{
invokeMarkAllForReplaceLater();
}
_session.getApplication().getMessageHandler().showMessage(s_stringMgr.getString("syntax.SquirrelRSyntaxSearchEngine.countOccurencesReplaced", count));
}
private void onReplace()
{
try
{
_lastSearchString = _dialog.getSearchString();
boolean found = SearchEngine.replace(
_squirrelRSyntaxTextArea,
_lastSearchString,
_dialog.getReplaceString(),
!_dialog.isSearchUp(),
_dialog.isMatchCase(),
_dialog.isWholeWord(),
_dialog.isRegExp());
if (_dialog.isMarkAll() && null != _dialog.getReplaceString() && 0 < _dialog.getReplaceString().length())
{
invokeMarkAllForReplaceLater();
}
if(false == found)
{
String msg = s_stringMgr.getString("syntax.SquirrelRSyntaxSearchEngine.noMatchRestart");
if(JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(_dialog.getDialog(), msg))
{
if (_dialog.isSearchUp())
{
_squirrelRSyntaxTextArea.setCaretPosition(_squirrelRSyntaxTextArea.getText().length());
}
else
{
_squirrelRSyntaxTextArea.setCaretPosition(0);
}
found = SearchEngine.replace(
_squirrelRSyntaxTextArea,
_lastSearchString,
_dialog.getReplaceString(),
!_dialog.isSearchUp(),
_dialog.isMatchCase(),
_dialog.isWholeWord(),
_dialog.isRegExp());
if (_dialog.isMarkAll() && null != _dialog.getReplaceString() && 0 < _dialog.getReplaceString().length())
{
invokeMarkAllForReplaceLater();
}
if(false == found)
{
JOptionPane.showMessageDialog(_dialog.getDialog(), s_stringMgr.getString("syntax.SquirrelRSyntaxSearchEngine.noMatch"));
}
else
{
_foundAtLeastOne = true;
}
}
}
else
{
_foundAtLeastOne = true;
}
}
catch (PatternSyntaxException pse)
{
// // There was a problem with the user's regex search string.
String msg = s_stringMgr.getString("syntax.SquirrelRSyntaxSearchEngine.RegExErrMsg");
String title = s_stringMgr.getString("syntax.SquirrelRSyntaxSearchEngine.RegExErrTitle", pse.toString());
JOptionPane.showMessageDialog(_dialog.getDialog(), msg, title, JOptionPane.ERROR_MESSAGE);
}
}
private void invokeMarkAllForReplaceLater()
{
_squirrelRSyntaxTextArea.clearMarkAllHighlights();
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
_squirrelRSyntaxTextArea.markAll(
_dialog.getReplaceString(),
_dialog.isMatchCase(),
_dialog.isWholeWord(),
_dialog.isRegExp());
}
});
}
private void storeCaretState()
{
_storedCaretState = new CaretState(_squirrelRSyntaxTextArea);
}
private void onDialogClosing()
{
_storedSearchDialogState = new SearchDialogState(_dialog);
if(false == _foundAtLeastOne)
{
_storedCaretState.restoreCaretState(_squirrelRSyntaxTextArea);
}
_dialog = null;
}
private void onFind()
{
try
{
_lastSearchString = _dialog.getSearchString();
if (_dialog.isMarkAll())
{
_squirrelRSyntaxTextArea.markAll(
_lastSearchString,
_dialog.isMatchCase(),
_dialog.isWholeWord(),
_dialog.isRegExp());
}
boolean found = SearchEngine.find(
_squirrelRSyntaxTextArea,
_lastSearchString,
!_dialog.isSearchUp(),
_dialog.isMatchCase(),
_dialog.isWholeWord(),
_dialog.isRegExp());
if(false == found)
{
String msg = s_stringMgr.getString("syntax.SquirrelRSyntaxSearchEngine.noMatchRestart");
if(JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(_dialog.getDialog(), msg))
{
if (_dialog.isSearchUp())
{
_squirrelRSyntaxTextArea.setCaretPosition(_squirrelRSyntaxTextArea.getText().length());
}
else
{
_squirrelRSyntaxTextArea.setCaretPosition(0);
}
found = SearchEngine.find(
_squirrelRSyntaxTextArea,
_lastSearchString,
!_dialog.isSearchUp(),
_dialog.isMatchCase(),
_dialog.isWholeWord(),
_dialog.isRegExp());
if(false == found)
{
JOptionPane.showMessageDialog(_dialog.getDialog(), s_stringMgr.getString("syntax.SquirrelRSyntaxSearchEngine.noMatch"));
}
else
{
_foundAtLeastOne = true;
}
}
}
else
{
_foundAtLeastOne = true;
}
}
catch (PatternSyntaxException pse)
{
// // There was a problem with the user's regex search string.
String msg = s_stringMgr.getString("syntax.SquirrelRSyntaxSearchEngine.RegExErrMsg");
String title = s_stringMgr.getString("syntax.SquirrelRSyntaxSearchEngine.RegExErrTitle", pse.toString());
JOptionPane.showMessageDialog(_dialog.getDialog(), msg, title, JOptionPane.ERROR_MESSAGE);
}
}
public void findSelected(ActionEvent evt)
{
String selectedText = _squirrelRSyntaxTextArea.getSelectedText();
if(null == selectedText || 0 == selectedText.length())
{
return;
}
_lastSearchString = selectedText;
_storedSearchDialogState = SearchDialogState.createForLastFind();
_repeatLastFind(_storedSearchDialogState);
}
private void _repeatLastFind(SearchDialogState searchDialogState)
{
boolean found =
SearchEngine.find(
_squirrelRSyntaxTextArea,
_lastSearchString,
!searchDialogState.isSearchUp(),
searchDialogState.isMatchCase(),
searchDialogState.isWholeWord(),
searchDialogState.isRegExp());
if(false == found)
{
storeCaretState();
if (searchDialogState.isSearchUp())
{
_squirrelRSyntaxTextArea.setCaretPosition(_squirrelRSyntaxTextArea.getText().length());
}
else
{
_squirrelRSyntaxTextArea.setCaretPosition(0);
}
found = SearchEngine.find(
_squirrelRSyntaxTextArea,
_lastSearchString,
!searchDialogState.isSearchUp(),
searchDialogState.isMatchCase(),
searchDialogState.isWholeWord(),
searchDialogState.isRegExp());
if(false == found)
{
_storedCaretState.restoreCaretState(_squirrelRSyntaxTextArea);
}
}
}
public void repeatLastFind(ActionEvent evt)
{
if(null == _lastSearchString || 0 == _lastSearchString.length() || null == _storedSearchDialogState)
{
return;
}
_repeatLastFind(_storedSearchDialogState);
}
public void markSelected(ActionEvent evt)
{
String selectedText = _squirrelRSyntaxTextArea.getSelectedText();
if(null == selectedText || 0 == selectedText.length())
{
return;
}
_lastSearchString = selectedText;
_storedSearchDialogState = SearchDialogState.createForLastFind();
_squirrelRSyntaxTextArea.markAll(
_lastSearchString,
_storedSearchDialogState.isMatchCase(),
_storedSearchDialogState.isWholeWord(),
_storedSearchDialogState.isRegExp());
}
public void unmarkAll()
{
_squirrelRSyntaxTextArea.clearMarkAllHighlights();
}
public void goToLine()
{
SquirrelGoToDialog squirrelGoToDialog = new SquirrelGoToDialog(_session.getApplication().getMainFrame());
squirrelGoToDialog.setMaxLineNumberAllowed(_squirrelRSyntaxTextArea.getLineCount());
squirrelGoToDialog.setVisible(true);
int lineNumber = squirrelGoToDialog.getLineNumber();
if (lineNumber > 0)
{
try
{
_squirrelRSyntaxTextArea.setCaretPosition(_squirrelRSyntaxTextArea.getLineStartOffset(lineNumber - 1));
}
catch (BadLocationException ble)
{
JOptionPane.showMessageDialog(_session.getApplication().getMainFrame(), s_stringMgr.getString("syntax.SquirrelRSyntaxSearchEngine.InvalidLineNumber"));
}
}
}
}
--- NEW FILE: SearchDialogClosingListener.java ---
package net.sourceforge.squirrel_sql.plugins.syntax.rsyntax.search;
public interface SearchDialogClosingListener
{
void searchDialogClosing();
}
--- NEW FILE: SquirrelFindDialog.java ---
package net.sourceforge.squirrel_sql.plugins.syntax.rsyntax.search;
import org.fife.ui.search.AbstractFindReplaceDialog;
import org.fife.ui.search.FindDialog;
import net.sourceforge.squirrel_sql.client.gui.mainframe.MainFrame;
import javax.swing.*;
import java.awt.event.*;
import java.util.ArrayList;
public class SquirrelFindDialog extends FindDialog implements ISquirrelSearchDialog
{
private ArrayList<SearchDialogClosingListener> _closingListeners = new ArrayList<SearchDialogClosingListener>();
public SquirrelFindDialog(MainFrame mainFrame)
{
super(mainFrame, null /* This ActionListener is not used, propably a bug in RText*/);
cancelButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
close();
}
});
addWindowListener(new WindowAdapter()
{
@Override
public void windowClosing(WindowEvent e)
{
fireClosing();
}
});
}
@Override
protected void escapePressed()
{
fireClosing();
super.escapePressed();
}
@Override
public void close()
{
fireClosing();
setVisible(false);
dispose();
}
private void fireClosing()
{
SearchDialogClosingListener[] listeners = _closingListeners.toArray(new SearchDialogClosingListener[_closingListeners.size()]);
for (SearchDialogClosingListener listener : listeners)
{
listener.searchDialogClosing();
}
}
@Override
public boolean isMatchCase()
{
return caseCheckBox.isSelected();
}
@Override
public boolean isWholeWord()
{
return wholeWordCheckBox.isSelected();
}
@Override
public boolean isRegExp()
{
return regExpCheckBox.isSelected();
}
@Override
public boolean isSearchUp()
{
return upButton.isSelected();
}
@Override
public boolean isMarkAll()
{
return markAllCheckBox.isSelected();
}
@Override
public JDialog getDialog()
{
return this;
}
@Override
public void addClosingListener(SearchDialogClosingListener l)
{
_closingListeners.add(l);
}
@Override
public void removeClosingListener(SearchDialogClosingListener l)
{
_closingListeners.remove(l);
}
@Override
public void addFindActionListener(ActionListener actionListener)
{
findNextButton.addActionListener(actionListener);
}
@Override
public void removeFindActionListener(ActionListener actionListener)
{
findNextButton.removeActionListener(actionListener);
}
@Override
public void addReplaceActionListener(ActionListener actionListener)
{
}
@Override
public void removeReplaceActionListener(ActionListener actionListener)
{
}
@Override
public void addReplaceAllActionListener(ActionListener actionListener)
{
}
@Override
public void removeReplaceAllActionListener(ActionListener actionListener)
{
}
@Override
public String getReplaceString()
{
throw new UnsupportedOperationException("Only available in SquirrelReplaceDialog");
}
}
--- NEW FILE: CaretState.java ---
package net.sourceforge.squirrel_sql.plugins.syntax.rsyntax.search;
import net.sourceforge.squirrel_sql.plugins.syntax.rsyntax.SquirrelRSyntaxTextArea;
public class CaretState
{
private int _selectionStart;
private int _selectionEnd;
private int _caretPosition;
public CaretState(SquirrelRSyntaxTextArea squirrelRSyntaxTextArea)
{
_selectionStart = squirrelRSyntaxTextArea.getSelectionStart();
_selectionEnd = squirrelRSyntaxTextArea.getSelectionEnd();
_caretPosition = squirrelRSyntaxTextArea.getCaretPosition();
}
void restoreCaretState(SquirrelRSyntaxTextArea squirrelRSyntaxTextArea)
{
if (_selectionStart < squirrelRSyntaxTextArea.getText().length())
{
squirrelRSyntaxTextArea.setSelectionStart(_selectionStart);
}
if (_selectionEnd < squirrelRSyntaxTextArea.getText().length())
{
squirrelRSyntaxTextArea.setSelectionEnd(_selectionEnd);
}
if (_caretPosition < squirrelRSyntaxTextArea.getText().length())
{
squirrelRSyntaxTextArea.setSelectionEnd(_caretPosition);
}
}
}
--- NEW FILE: SearchDialogState.java ---
package net.sourceforge.squirrel_sql.plugins.syntax.rsyntax.search;
public class SearchDialogState
{
private boolean _searchUp;
private boolean _matchCase;
private boolean _wholeWord;
private boolean _regExp;
public SearchDialogState(ISquirrelSearchDialog dialog)
{
_searchUp = dialog.isSearchUp();
_matchCase = dialog.isMatchCase();
_wholeWord = dialog.isWholeWord();
_regExp = dialog.isRegExp();
}
private SearchDialogState(boolean searchUp, boolean matchCase, boolean wholeWord, boolean regExp)
{
_searchUp = searchUp;
_matchCase = matchCase;
_wholeWord = wholeWord;
_regExp = regExp;
}
public boolean isSearchUp()
{
return _searchUp;
}
public boolean isMatchCase()
{
return _matchCase;
}
public boolean isWholeWord()
{
return _wholeWord;
}
public boolean isRegExp()
{
return _regExp;
}
public static SearchDialogState createForLastFind()
{
return new SearchDialogState(false, false, false, false);
}
}
--- NEW FILE: ISquirrelSearchDialog.java ---
package net.sourceforge.squirrel_sql.plugins.syntax.rsyntax.search;
import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.WindowListener;
import java.awt.*;
import java.util.Vector;
public interface ISquirrelSearchDialog
{
void setSearchParameters(Vector findComboBoxStrings, boolean matchCase, boolean wholeWord, boolean regExp, boolean searchUp, boolean markAll);
void setSearchString(String selectedText);
void setVisible(boolean b);
String getSearchString();
void close();
boolean isMatchCase();
boolean isWholeWord();
boolean isRegExp();
boolean isSearchUp();
boolean isMarkAll();
JDialog getDialog();
void addClosingListener(SearchDialogClosingListener searchDialogClosingListener);
void removeClosingListener(SearchDialogClosingListener searchDialogClosingListener);
void requestFocus();
void addFindActionListener(ActionListener actionListener);
void removeFindActionListener(ActionListener actionListener);
void addReplaceActionListener(ActionListener actionListener);
void removeReplaceActionListener(ActionListener actionListener);
void addReplaceAllActionListener(ActionListener actionListener);
void removeReplaceAllActionListener(ActionListener actionListener);
String getReplaceString();
}
--- NEW FILE: SquirrelGoToDialog.java ---
package net.sourceforge.squirrel_sql.plugins.syntax.rsyntax.search;
/*
* 11/14/2003
*
* GoToDialog.java - A dialog allowing you to skip to a specific line number
* in a document in RText.
* Copyright (C) 2003 Robert Futrell
* robert_futrell at users.sourceforge.net
* http://rtext.fifesoft.com
*
* This file is a part of RText.
*
* RText is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or any later version.
*
* RText is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
import net.sourceforge.squirrel_sql.fw.util.StringManager;
import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
import org.fife.ui.EscapableDialog;
import org.fife.ui.RButton;
import org.fife.ui.ResizableFrameContentPane;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* A "Go To" dialog allowing you to go to a specific line number in a document
* in RText.
*
* @author Robert Futrell
* @version 1.0
*
* Had to be copied because it worked with the RText class
*
*/
public class SquirrelGoToDialog extends EscapableDialog
{
private static final StringManager s_stringMgr =
StringManagerFactory.getStringManager(SquirrelGoToDialog.class);
private JButton okButton;
private JButton cancelButton;
private JTextField lineNumberField;
private int maxLineNumberAllowed; // Number of lines in the document.
private int lineNumber; // The line to go to, or -1 for Cancel.
/**
* Creates a new <code>GoToDialog</code>.
*
* @param owner The rtext window that owns this dialog.
*/
public SquirrelGoToDialog(JFrame parent)
{
// Let it be known who the owner of this dialog is.
super(parent);
ComponentOrientation orientation = ComponentOrientation.
getOrientation(getLocale());
lineNumber = 1;
maxLineNumberAllowed = 1; // Empty document has 1 line.
GoToListener listener = new GoToListener();
// Set the main content pane for the "GoTo" dialog.
JPanel contentPane = new ResizableFrameContentPane(new BorderLayout());
contentPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
setContentPane(contentPane);
// Make a panel containing the "Line Number" edit box.
JPanel enterLineNumberPane = new JPanel();
BoxLayout box = new BoxLayout(enterLineNumberPane, BoxLayout.LINE_AXIS);
enterLineNumberPane.setLayout(box);
lineNumberField = new JTextField(16);
lineNumberField.setText("" + lineNumber);
AbstractDocument doc = (AbstractDocument) lineNumberField.getDocument();
doc.addDocumentListener(listener);
doc.setDocumentFilter(new GoToDocumentFilter());
enterLineNumberPane.add(new JLabel(s_stringMgr.getString("syntax.SquirrelGoToDialog.LineNumber")));
enterLineNumberPane.add(lineNumberField);
// Make a panel containing the OK and Cancel buttons.
JPanel buttonPanel = new JPanel(new GridLayout(1, 2, 5, 5));
okButton = createRButton(s_stringMgr.getString("syntax.SquirrelGoToDialog.OKButtonLabel"), s_stringMgr.getString("syntax.SquirrelGoToDialog.OKButtonMnemonic"));
okButton.setActionCommand("OK");
okButton.addActionListener(listener);
cancelButton = createRButton(s_stringMgr.getString("syntax.SquirrelGoToDialog.Cancel"), s_stringMgr.getString("syntax.SquirrelGoToDialog.CancelMnemonic"));
cancelButton.setActionCommand("Cancel");
cancelButton.addActionListener(listener);
buttonPanel.add(okButton);
buttonPanel.add(cancelButton);
// Put everything into a neat little package.
contentPane.add(enterLineNumberPane, BorderLayout.NORTH);
JPanel temp = new JPanel();
temp.add(buttonPanel);
contentPane.add(temp, BorderLayout.SOUTH);
JRootPane rootPane = getRootPane();
rootPane.setDefaultButton(okButton);
setTitle(s_stringMgr.getString("syntax.SquirrelGoToDialog.GotoDialogTitle"));
setModal(true);
applyComponentOrientation(orientation);
pack();
setLocationRelativeTo(parent);
}
public static final RButton createRButton(String textKey, String mnemonicKey)
{
RButton b = new RButton(textKey);
b.setMnemonic((int) mnemonicKey.charAt(0));
return b;
}
/**
* Called when they've clicked OK or pressed Enter; check the line number
* they entered for validity and if it's okay, close this dialog. If it
* isn't okay, display an error message.
*/
private void attemptToGetGoToLine()
{
try
{
lineNumber = Integer.parseInt(lineNumberField.getText());
if (lineNumber < 1 || lineNumber > maxLineNumberAllowed)
throw new NumberFormatException();
// If we have a valid line number, close the dialog!
setVisible(false);
}
catch (NumberFormatException nfe)
{
JOptionPane.showMessageDialog(this,
s_stringMgr.getString("syntax.SquirrelGoToDialog.LineNumberRange", maxLineNumberAllowed),
s_stringMgr.getString("syntax.SquirrelGoToDialog.ErrorDialogTitle"),
JOptionPane.ERROR_MESSAGE);
return;
}
}
/**
* Called when the user clicks Cancel or hits the Escape key. This
* hides the dialog.
*/
protected void escapePressed()
{
lineNumber = -1;
super.escapePressed();
}
/**
* Gets the line number the user entered to go to.
*
* @return The line number the user decided to go to, or <code>-1</code>
* if the dialog was canceled.
*/
public int getLineNumber()
{
return lineNumber;
}
/**
* Sets the maximum line number for them to enter.
*
* @param max The new maximum line number value.
*/
public void setMaxLineNumberAllowed(int max)
{
this.maxLineNumberAllowed = max;
}
/**
* Overrides <code>JDialog</code>'s <code>setVisible</code> method; decides
* whether or not buttons are enabled if the user is enabling the dialog.
*/
public void setVisible(boolean visible)
{
if (visible)
{
lineNumber = -1;
okButton.setEnabled(lineNumberField.getDocument().getLength() > 0);
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
lineNumberField.requestFocusInWindow();
lineNumberField.selectAll();
}
});
}
super.setVisible(visible);
}
/**
* A document filter that only allows numbers.
*/
static class GoToDocumentFilter extends DocumentFilter
{
private final String cleanse(String text)
{
boolean beep = false;
if (text != null)
{
int length = text.length();
for (int i = 0; i < length; i++)
{
if (!Character.isDigit(text.charAt(i)))
{
text = text.substring(0, i) + text.substring(i + 1);
i--;
length--;
beep = true;
}
}
}
if (beep)
UIManager.getLookAndFeel().provideErrorFeedback(null);
return text;
}
public void insertString(DocumentFilter.FilterBypass fb,
int offset, String text, AttributeSet attr)
throws BadLocationException
{
fb.insertString(offset, cleanse(text), attr);
}
public void remove(DocumentFilter.FilterBypass fb,
int offset, int length)
throws BadLocationException
{
fb.remove(offset, length);
}
public void replace(DocumentFilter.FilterBypass fb,
int offset, int length, String text, AttributeSet attr)
throws BadLocationException
{
fb.replace(offset, length, cleanse(text), attr);
}
}
/**
* Listens for events in this dialog.
*/
private class GoToListener implements ActionListener, DocumentListener
{
public void actionPerformed(ActionEvent e)
{
String command = e.getActionCommand();
if (command.equals("OK"))
attemptToGetGoToLine();
else if (command.equals("Cancel"))
escapePressed();
}
public void changedUpdate(DocumentEvent e)
{
}
public void insertUpdate(DocumentEvent e)
{
okButton.setEnabled(lineNumberField.getDocument().getLength() > 0);
}
public void removeUpdate(DocumentEvent e)
{
okButton.setEnabled(lineNumberField.getDocument().getLength() > 0);
}
}
}
|