package com.simonepezzano.hshare.composites;
import java.io.File;
import java.net.URI;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetAdapter;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.TreeColumn;
import com.simonepezzano.hshare.HFiles;
import com.simonepezzano.hshare.HLog;
import com.simonepezzano.hshare.Statics;
import com.simonepezzano.hshare.dialogs.AttributesDialog;
import com.simonepezzano.hshare.providers.TreeFilesLabelProvider;
import com.simonepezzano.hshare.providers.TreeFilesProvider;
import com.simonepezzano.hshare.providers.TreeSorter;
/**
* This composite contains the information about the shared directories and files
* @author Simone Pezzano
*/
public class StuffComposite extends Composite {
private TreeViewer tv;
private TreeSorter ts;
private TreeFilesProvider tfp;
private TreeFilesLabelProvider tflp;
public StuffComposite(Composite parent, int style) {
super(parent, style);
setLayout(new GridLayout());
tv = new TreeViewer(this,SWT.BORDER|SWT.MULTI);
tv.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
tv.getTree().setHeaderVisible(true);
TreeColumn tc0 = new TreeColumn(tv.getTree(),SWT.NONE);
tc0.setText("Path");
tc0.setWidth(400);
TreeColumn tc1 = new TreeColumn(tv.getTree(),SWT.NONE);
tc1.setText("Size");
tc1.setWidth(100);
TreeColumn tc2 = new TreeColumn(tv.getTree(),SWT.NONE);
tc2.setText("A.K.A.");
tc2.setWidth(150);
TreeColumn tc3 = new TreeColumn(tv.getTree(),SWT.MULTI);
tc3.setText("Comment");
tc3.setWidth(200);
tfp = new TreeFilesProvider();
tflp = new TreeFilesLabelProvider();
ts = new TreeSorter();
tv.setContentProvider(tfp);
tv.setLabelProvider(tflp);
tv.setSorter(ts);
tv.setInput(DocumentHelper.createDocument());
tv.addDoubleClickListener(new IDoubleClickListener(){
public void doubleClick(DoubleClickEvent event) {
startEdit(((Element)((IStructuredSelection)event.getSelection()).getFirstElement()));
}
});
DropTarget dt = new DropTarget(tv.getTree(), DND.DROP_LINK);
dt.setTransfer(new Transfer[] { TextTransfer.getInstance() });
dt.addDropListener(new DropTargetAdapter() {
public void drop(DropTargetEvent event) {
try{
String uriStr = String.valueOf(event.data).trim();
URI uri = URI.create(uriStr);
HFiles.getInstance().add(new File(uri).getAbsolutePath());
refresh();
}catch(Exception e){e.printStackTrace();}
}
});
try {
refresh();
} catch (DocumentException e) {
HLog.doclogger.fatal("Refreshing the files document revealed it to be malformed, how strange...",e);
}
}
/**
* Checks the tree consistency and refreshes the treeviewer displaying the share areas
* @throws DocumentException
*/
public void refresh() throws DocumentException{
Document doc = HFiles.getInstance().getDocument();
HFiles.getInstance().checkTree(doc.getRootElement());
tfp.setFiles(doc);
tv.refresh();
}
/**
* Opens the editing window
* @param el the HShare descriptor we want to edit
*/
public void startEdit(Element el){
AttributesDialog ad = new AttributesDialog(StuffComposite.this.getShell(),el);
ad.setLocation(Statics.getOriginForCenter(AttributesDialog.WIDTH, AttributesDialog.HEIGHT));
HLog.facelogger.debug("Starting properties editing");
ad.addDisposeListener(new DisposeListener(){
public void widgetDisposed(DisposeEvent e) {
HLog.facelogger.debug("Properties editing finished, refreshing contents");
tv.refresh();
}
});
ad.open();
}
/**
* Opens the editing window for the selected ite
*/
public void startEdit(){
startEdit(((Element)((IStructuredSelection)tv.getSelection()).getFirstElement()));
}
/**
* @return the TreeViewer displaying the share information
*/
public TreeViewer getTv() {
return tv;
}
}