package com.tail;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetAdapter;
import java.awt.dnd.DropTargetDropEvent;
import java.io.File;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class TailTabbedPane extends JComponent{
private HeadPanel headPanel;
private JPanel tabbedPane;
private final String EMPTY_CARD_PANEL = "EmptyCardPanel";
public TailTabbedPane(){
initComponents();
}
public void initComponents(){
setLayout(new BorderLayout());
headPanel = new HeadPanel();
tabbedPane = new JPanel(new CardLayout());
addEmptyCardPanel();
add(headPanel, BorderLayout.NORTH);
add(tabbedPane, BorderLayout.CENTER);
setHeadPanelVisible(false);
this.setDropTarget(new DropTarget(this,new TailDropFileAdapter()));
}
private void addEmptyCardPanel(){
JPanel panel = new JPanel(new BorderLayout());
JLabel label = new JLabel("Drag file to tail here...");
label.setForeground(Color.GRAY);
label.setHorizontalAlignment(JLabel.CENTER);
panel.add(label);
tabbedPane.add(panel, EMPTY_CARD_PANEL);
}
public void addTab(String file){
tabbedPane.add(file, new TextPanel());
headPanel.addTab(file);
((CardLayout) tabbedPane.getLayout()).show(tabbedPane, file);
if (!headPanel.isVisible()){
setHeadPanelVisible(true);
}
}
private void setHeadPanelVisible(boolean isVisible){
if (isVisible){
tabbedPane.setBorder(BorderFactory.createMatteBorder(0,1,1,1,Color.GRAY));
}else{
tabbedPane.setBorder(BorderFactory.createLineBorder(Color.GRAY,1));
}
headPanel.setVisible(isVisible);
}
class TailDropFileAdapter extends DropTargetAdapter{
@Override
public void drop(DropTargetDropEvent event) {
// Accept copy drops
event.acceptDrop(DnDConstants.ACTION_COPY);
// Get the transfer which can provide the dropped item data
Transferable transferable = event.getTransferable();
// Get the data formats of the dropped item
DataFlavor[] flavors = transferable.getTransferDataFlavors();
// Loop through the flavors
for (DataFlavor flavor : flavors) {
try {
// If the drop items are files
if (flavor.isFlavorJavaFileListType()) {
// Get all of the dropped files
Object transferData = transferable.getTransferData(flavor);
if (transferData instanceof List<?>){
@SuppressWarnings("unchecked")
List<File> files = (List<File>) transferData;
// Loop them through
for (int i=0; i<files.size() ;i++) {
// Print out the file path
System.out.println("File path is '" + ((File)files.get(i)).getPath() + "'.");
String file = ((File)files.get(i)).getName();
addTab(file);
}
}
}
} catch (Exception e) {
// Print out the error stack
e.printStackTrace();
}
}
// Inform that the drop is complete
event.dropComplete(true);
}
}
}