/*
* Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.tools.visualvm.modules.appui.about;
import com.sun.tools.visualvm.uisupport.UISupport;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ResourceBundle;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JTextArea;
import javax.swing.UIManager;
/**
* @author Ian Formanek
* @author Jiri Sedlacek
*/
public class TextViewerComponent extends JTextArea implements MouseListener {
/** Private Writer that extracts correctly formatted string from HTMLDocument */
// -----
// I18N String constants
private static final ResourceBundle messages = ResourceBundle.getBundle("com.sun.tools.visualvm.modules.appui.about.Bundle"); // NOI18N
private static final String CUT_STRING = messages.getString("TextViewerComponent_CutString"); // NOI18N
private static final String COPY_STRING = messages.getString("TextViewerComponent_CopyString"); // NOI18N
private static final String PASTE_STRING = messages.getString("TextViewerComponent_PasteString"); // NOI18N
private static final String DELETE_STRING = messages.getString("TextViewerComponent_DeleteString"); // NOI18N
private static final String SELECT_ALL_STRING = messages.getString("TextViewerComponent_SelectAllString"); // NOI18N
// -----
//~ Instance fields ----------------------------------------------------------------------------------------------------------
private ActionListener popupListener;
private JMenuItem itemCopy;
private JMenuItem itemCut;
private JMenuItem itemDelete;
private JMenuItem itemPaste;
private JMenuItem itemSelectAll;
// --- Popup menu support ----------------------------------------------------
private JPopupMenu popupMenu;
private boolean showPopup = true;
//~ Constructors -------------------------------------------------------------------------------------------------------------
public TextViewerComponent() {
setEditable(false);
setOpaque(true);
setAutoscrolls(true);
setFont(new Font("Monospaced", Font.PLAIN, UIManager.getFont("Label.font").getSize())); // NOI18N
setBackground(UISupport.getDefaultBackground());
addMouseListener(this);
}
public TextViewerComponent(String text) {
this();
setText(text);
}
//~ Methods ------------------------------------------------------------------------------------------------------------------
public void setShowPopup(boolean showPopup) {
this.showPopup = showPopup;
}
public boolean getShowPopup() {
return showPopup;
}
public void deleteSelection() {
try {
getDocument().remove(getSelectionStart(), getSelectionEnd() - getSelectionStart());
} catch (Exception ex) {
}
}
public void mouseClicked(MouseEvent e) {
if (e.getModifiers() == InputEvent.BUTTON3_MASK) {
if (isEnabled() && isFocusable() && showPopup) {
JPopupMenu popup = getPopupMenu();
if (popup != null) {
updatePopupMenu();
if (!hasFocus()) {
requestFocus(); // required for Select All functionality
}
popup.show(this, e.getX(), e.getY());
}
}
}
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void paste() {
try {
replaceSelection(Toolkit.getDefaultToolkit().getSystemClipboard().getContents(this)
.getTransferData(DataFlavor.stringFlavor).toString());
} catch (Exception ex) {
}
}
protected JPopupMenu getPopupMenu() {
if (popupMenu == null) {
popupMenu = createPopupMenu();
}
return popupMenu;
}
protected JPopupMenu createPopupMenu() {
JPopupMenu popup = new JPopupMenu();
popupListener = createPopupListener();
itemCut = new JMenuItem(CUT_STRING);
itemCopy = new JMenuItem(COPY_STRING);
itemPaste = new JMenuItem(PASTE_STRING);
itemDelete = new JMenuItem(DELETE_STRING);
itemSelectAll = new JMenuItem(SELECT_ALL_STRING);
itemCut.addActionListener(popupListener);
itemCopy.addActionListener(popupListener);
itemPaste.addActionListener(popupListener);
itemDelete.addActionListener(popupListener);
itemSelectAll.addActionListener(popupListener);
popup.add(itemCut);
popup.add(itemCopy);
popup.add(itemPaste);
popup.add(itemDelete);
popup.addSeparator();
popup.add(itemSelectAll);
return popup;
}
protected void updatePopupMenu() {
// Cut
itemCut.setEnabled(isEditable() && (getSelectedText() != null));
// Copy
itemCopy.setEnabled(getSelectedText() != null);
// Paste
try {
Transferable clipboardContent = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(this);
itemPaste.setEnabled(isEditable() && (clipboardContent != null)
&& clipboardContent.isDataFlavorSupported(DataFlavor.stringFlavor));
} catch (Exception e) {
itemPaste.setEnabled(false);
}
// Delete
if (isEditable()) {
itemDelete.setVisible(true);
itemDelete.setEnabled(getSelectedText() != null);
} else {
itemDelete.setVisible(false);
}
// Select All
// always visible and enabled...
}
private ActionListener createPopupListener() {
return new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == itemCut) {
cut();
} else if (e.getSource() == itemCopy) {
copy();
} else if (e.getSource() == itemPaste) {
paste();
} else if (e.getSource() == itemDelete) {
deleteSelection();
} else if (e.getSource() == itemSelectAll) {
selectAll();
}
}
};
}
}