package com.simonepezzano.hshare.views;
import hshare.Activator;
import java.io.IOException;
import java.util.Iterator;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
import org.mortbay.jetty.Server;
import com.simonepezzano.hshare.HFiles;
import com.simonepezzano.hshare.HLog;
import com.simonepezzano.hshare.Statics;
import com.simonepezzano.hshare.composites.InfoComposite;
import com.simonepezzano.hshare.composites.StuffComposite;
/**
* The main MooSharee view
* @author Simone Pezzano
*
*/
public class MainView extends ViewPart implements SelectionListener,ISelectionChangedListener,IHShareView{
public static final String LABEL_START="Start Server";
public static final String LABEL_STOP="Stop Server";
public static final String ID="HShare.view";
private InfoComposite ic;
private StuffComposite sc;
ToolItem serverItem,addItem,removeItem,refreshItem,editItem;
private Server server;
@Override
public void createPartControl(Composite parent) {
parent.setLayout(new GridLayout());
Statics.checkResDir();
Statics.checkDirTemplatesDir();
server = Statics.getServerInstance();
ic = new InfoComposite(parent,SWT.BORDER);
ic.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
ToolBar tb = new ToolBar(parent,SWT.HORIZONTAL);
serverItem = new ToolItem(tb,SWT.NONE);
serverItem.setText(LABEL_START);
serverItem.setImage(Activator.getImageDescriptor("icons/mix_world_32.png").createImage());
serverItem.addSelectionListener(this);
new ToolItem(tb,SWT.SEPARATOR);
addItem = new ToolItem(tb,SWT.NONE);
addItem.setText("Add directory");
addItem.setImage(Activator.getImageDescriptor("icons/folder_32.png").createImage());
addItem.addSelectionListener(this);
removeItem = new ToolItem(tb,SWT.NONE);
removeItem.setText("Remove directory");
removeItem.setImage(Activator.getImageDescriptor("icons/trash_arrow_32.png").createImage());
removeItem.setEnabled(false);
removeItem.addSelectionListener(this);
new ToolItem(tb,SWT.SEPARATOR);
editItem = new ToolItem(tb,SWT.NONE);
editItem.setText("Edit properties");
editItem.setImage(Activator.getImageDescriptor("icons/application-edit.png").createImage());
editItem.setEnabled(false);
editItem.addSelectionListener(this);
new ToolItem(tb,SWT.SEPARATOR);
refreshItem = new ToolItem(tb,SWT.NONE);
refreshItem.setText("Refresh");
refreshItem.setImage(Activator.getImageDescriptor("icons/reload_32.png").createImage());
refreshItem.addSelectionListener(this);
tb.pack();
sc = new StuffComposite(parent,SWT.NONE);
sc.setLayoutData(new GridData(GridData.FILL_BOTH));
sc.getTv().addSelectionChangedListener(this);
sc.addMouseListener(new MouseListener() {
public void mouseUp(MouseEvent e) {}
public void mouseDown(MouseEvent e) {}
public void mouseDoubleClick(MouseEvent e) {
// Double click any folder to edit properties
sc.startEdit();
}
});
}
/**
* Refreshes the tree
* @throws DocumentException
*/
public void refreshTree() throws DocumentException{
sc.refresh();
}
@Override
public void setFocus() {
sc.getTv().getTree().setFocus();
}
public void widgetDefaultSelected(SelectionEvent e) {}
@SuppressWarnings("unchecked")
public void widgetSelected(SelectionEvent e) {
if(e.getSource().equals(serverItem)){
try{
if(isStarted()){
LogsView.instance.addItem("Stopping server");
server.stop();
ic.setStatus(InfoComposite.STATUS_DISCONNECTED);
serverItem.setText(LABEL_START);
LogsView.instance.addItem("Server stopped");
}
else{
LogsView.instance.addItem("Starting server");
server.start();
ic.setStatus(InfoComposite.STATUS_CONNECTED);
serverItem.setText(LABEL_STOP);
LogsView.instance.addItem("Server started");
}
return;
}catch(Exception ex){
LogsView.instance.addItem("Could not start server!");
HLog.netlogger.fatal("Unable to start server. Big issue here...",ex);
}
}
if(e.getSource().equals(addItem)){
DirectoryDialog dd = new DirectoryDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
try {
HFiles.getInstance().add(dd.open());
refreshTree();
} catch (DocumentException e1) {
HLog.doclogger.fatal("The document seems to be corrupted after adding item",e1);
} catch (IOException e2) {
HLog.doclogger.error("Could not read important info from disk",e2);
}
}
if(e.getSource().equals(removeItem))
try {
Iterator<Element> items = ((IStructuredSelection)sc.getTv().getSelection()).iterator();
while(items.hasNext()){
Element el = items.next();
if(Statics.isAFile(el))
el = el.getParent();
HFiles.getInstance().removeDir(el);
}
HFiles.getInstance().saveHFiles();
sc.refresh();
} catch (DocumentException e1) {
HLog.doclogger.fatal("The document seems to be corrupted after item removal",e1);
} catch (IOException e2) {
HLog.iologger.fatal("Could not save document after item removal",e2);
}
if(e.getSource().equals(editItem)){
sc.startEdit();
}
if(e.getSource().equals(refreshItem))
try {
HFiles.getInstance().checkTree();
sc.refresh();
} catch (DocumentException e1) {
HLog.doclogger.fatal("The document seems to be corrupted after refreshing",e1);
}
}
/**
* @return true if the server started or is starting
*/
private boolean isStarted(){
return server.isStarted()||server.isStarting();
}
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection sel = (IStructuredSelection) event.getSelection();
if(sel!=null){
boolean enabled = sel.getFirstElement()!=null;
editItem.setEnabled(enabled);
removeItem.setEnabled(enabled);
return;
}
removeItem.setEnabled(false);
}
public void updateData() {
ic.fillData();
}
}