VAqua.src.org.violetlib.aqua.fc.BasicBrowserUI Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of vaqua Show documentation
Show all versions of vaqua Show documentation
An improved native Swing look and feel for macOS
The newest version!
/*
* Copyright (c) 2005-2013 Werner Randelshofer, Switzerland.
* Copyright (c) 2018 Alan Snyder
* You may not use, copy or modify this file, except in compliance with the
* accompanying license terms.
*/
package org.violetlib.aqua.fc;
import java.awt.*;
import java.awt.datatransfer.Transferable;
import java.util.ArrayList;
import java.util.Collections;
import javax.swing.*;
import javax.swing.plaf.UIResource;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
import org.violetlib.aqua.AppearanceManager;
import org.violetlib.aqua.AquaAppearance;
/**
* BasicBrowserUI.
*
* @author Werner Randelshofer
* @version $Id$
*/
public class BasicBrowserUI extends BrowserUI {
protected JBrowser browser;
/**
* Creates a new instance.
*/
public BasicBrowserUI() {
}
//
// Install methods
//
@Override
public void installUI(JComponent c) {
c.setBackground(UIManager.getColor("List.background"));
c.setFont(UIManager.getFont("List.font"));
browser = (JBrowser) c;
installDefaults();
}
protected void installDefaults() {
if (browser.getColumnCellRenderer() == null ||
(browser.getColumnCellRenderer() instanceof UIResource)) {
browser.setColumnCellRenderer(createCellRenderer());
}
TransferHandler th = browser.getTransferHandler();
if (th == null || th instanceof UIResource) {
browser.setTransferHandler(defaultTransferHandler);
}
}
//
// Uninstall methods
//
@Override
public void uninstallUI(JComponent c) {
uninstallDefaults();
}
protected void uninstallDefaults() {
if (browser.getTransferHandler() instanceof UIResource) {
browser.setTransferHandler(null);
}
}
@Override
public void update(Graphics g, JComponent c) {
AquaAppearance appearance = AppearanceManager.ensureAppearance(c);
if (c.isOpaque()) {
Color background = appearance.getColor("controlBackground");
g.setColor(background);
g.fillRect(0, 0, c.getWidth(),c.getHeight());
}
paint(g, c);
}
protected ListCellRenderer createCellRenderer() {
return new DefaultColumnCellRenderer.UIResource(browser);
}
private static final TransferHandler defaultTransferHandler = new BrowserTransferHandler();
static class BrowserTransferHandler extends TransferHandler implements UIResource/*, Comparator*/ {
private JBrowser browser;
/**
* Create a Transferable to use as the source for a data transfer.
*
* @param c The component holding the data to be transfered. This
* argument is provided to enable sharing of TransferHandlers by
* multiple components.
* @return The representation of the data to be transfered.
*
*/
@Override
protected Transferable createTransferable(JComponent c) {
while (c != null && !(c instanceof JBrowser)) {
c = (c.getParent() instanceof JComponent) ? (JComponent) c.getParent() : null;
}
if (c != null) {
browser = (JBrowser) c;
TreePath[] paths = browser.getSelectionPaths();
if (paths == null || paths.length == 0) {
return null;
}
StringBuffer plainBuf = new StringBuffer();
StringBuffer htmlBuf = new StringBuffer();
htmlBuf.append("\n\n\n");
TreeModel model = browser.getModel();
TreePath lastPath = null;
TreePath[] displayPaths = getDisplayOrderPaths(paths);
for (int i = 0; i < displayPaths.length; i++) {
TreePath path = displayPaths[i];
Object node = path.getLastPathComponent();
boolean leaf = model.isLeaf(node);
String label = getDisplayString(path, true, leaf);
plainBuf.append(label + "\n");
htmlBuf.append(" - " + label + "\n");
}
// remove the last newline
plainBuf.deleteCharAt(plainBuf.length() - 1);
htmlBuf.append("
\n\n");
browser = null;
CompositeTransferable t = new CompositeTransferable();
t.add(new DefaultTransferable(htmlBuf.toString(), "text/html", "HTML"));
t.add(new DefaultTransferable(plainBuf.toString(), "text/plain", "Text"));
return t;
}
return null;
}
/*
public int compare(Object o1, Object o2) {
int row1 = browser.getRowForPath((TreePath)o1);
int row2 = browser.getRowForPath((TreePath)o2);
return row1 - row2;
}
*/
String getDisplayString(TreePath path, boolean selected, boolean leaf) {
Object node = path.getLastPathComponent();
if (node != null) {
String sValue = node.toString();
if (sValue != null) {
return sValue;
}
}
return "";
}
/**
* Selection paths are in selection order. The conversion to
* HTML requires display order. This method resorts the paths
* to be in the display order.
*/
TreePath[] getDisplayOrderPaths(TreePath[] paths) {
// sort the paths to display order rather than selection order
ArrayList selOrder = new ArrayList();
Collections.addAll(selOrder, paths);
//Collections.sort(selOrder, this);
int n = selOrder.size();
TreePath[] displayPaths = new TreePath[n];
for (int i = 0; i < n; i++) {
displayPaths[i] = (TreePath) selOrder.get(i);
}
return displayPaths;
}
public int getSourceActions(JComponent c) {
return COPY;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy