package omschaub.todo;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import org.eclipse.swt.SWT;
import omschaub.todo.EpiMaker;
import org.eclipse.swt.custom.TableTree;
import org.eclipse.swt.custom.TableTreeEditor;
import org.eclipse.swt.custom.TableTreeItem;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
//import org.eclipse.swt.events.SelectionAdapter;
//import org.eclipse.swt.events.SelectionEvent;
//import org.eclipse.swt.events.TreeAdapter;
import org.eclipse.swt.events.TreeEvent;
import org.eclipse.swt.events.TreeListener;
//import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Monitor;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
//import org.eclipse.swt.widgets.Widget;
import org.gudy.azureus2.plugins.PluginInterface;
import org.gudy.azureus2.plugins.PluginView;
public class View extends PluginView {
//The current Display
private Display display;
//This view main GUI object
private Composite composite;
EpiMaker epiMaker;
boolean tableCounter = false ;
String name;
String lines[] = new String[10];
Table listEps;
TableTree listEpsTree;
//The Plugin interface
PluginInterface pluginInterface;
// PluginManager pluginManager;
public View(PluginInterface pluginInterface) {
this.pluginInterface = pluginInterface;
}
/**
* The Plugin name, as it'll be seen within the Plugins Menu in azureus
*/
public String getPluginViewName() {
return "ToDo";
}
/**
* The plugin Title, used for its Tab name in the main window
*/
public String getFullTitle() {
return "ToDo";
}
/**
* Here stands any GUI initialisation
*/
public void initialize(Composite parent) {
// We store the Display variable as we'll need it for async GUI Changes
this.display = parent.getDisplay();
// We create our own composite, on which we'll add our components.
this.composite = new Composite(parent,SWT.NULL);
GridLayout layout = new GridLayout();
//3 columns, as first row will have 3 elements.
layout.numColumns = 3;
composite.setLayout(layout);
//Main Table for Episode List
listEpsTree = new TableTree(composite, SWT.FULL_SELECTION | SWT.BORDER);
//listEps = new Table(composite,SWT.FULL_SELECTION | SWT.BORDER);
GridData gridData = new GridData(GridData.FILL_BOTH);
gridData.horizontalSpan = 3;
listEpsTree.setLayoutData( gridData );
listEps = listEpsTree.getTable() ;
listEps.setHeaderVisible(true);
//listEps.setLinesVisible( true );
TableColumn epiNameColumn = new TableColumn(listEps,SWT.NULL);
epiNameColumn.setText("Plugin Name");
epiNameColumn.setWidth(300);
TableColumn epiNumberColumn = new TableColumn(listEps,SWT.NULL);
epiNumberColumn.setText("ToDo");
epiNumberColumn.setWidth( 300);
gridData = new GridData(GridData.FILL_BOTH);
gridData.horizontalSpan = 3;
listEps.setLayoutData( gridData);
//inline editor declaration
final TableTreeEditor editor = new TableTreeEditor (listEpsTree);
//Table Listener
listEps.addMouseListener(new MouseAdapter() {
public void mouseDoubleClick(MouseEvent event) {
// Check is the table is not disposed
if(listEps == null || listEps.isDisposed())
return;
//Get the selection
TableItem[] items = listEps.getSelection();
//If an item is selected (single click selects at least one)
if(items.length == 1) {
name = items[0].getText();
//lines[2] = items[1].getText();
epiMaker = new EpiMaker();
lines = epiMaker.commentOpen(pluginInterface, name);
inLineEdit(editor);
//openForEdit(lines, false);
}
}
});
//Tree Listener
/* listEpsTree.addSelectionListener (new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
TableTreeItem[] selection = listEpsTree.getSelection();
if (selection.length == 0) return;
TableTreeItem item = selection[0];
if (item.getExpanded())
{
item.setExpanded( false );
} else
{
item.setExpanded( true );
}
}
});*/
listEpsTree.addTreeListener( new TreeListener(){
public void treeCollapsed(TreeEvent arg0) {
// TODO Auto-generated method stub
System.out.println("Collapsed");
}
public void treeExpanded(TreeEvent arg0) {
// TODO Auto-generated method stub
System.out.println("Expanded");
}
});
// popup menu
Menu popupmenu = new Menu(composite );
MenuItem deleteItem = new MenuItem(popupmenu, SWT.PUSH);
deleteItem.setText("Delete from List");
deleteItem.addListener(SWT.Selection, new Listener() {
public void handleEvent (Event e){
try {
// Check is the table is not disposed
if(listEps == null || listEps.isDisposed())
return;
//Get the selection
TableItem[] items = listEps.getSelection();
//If an item is selected (single click selects at least one)
if(items.length == 1) {
//Grab selected item
TableItem item = items[0];
String nameToDie = item.getText(0);
String episode = item.getText(1);
item.dispose();
deleteFromList(nameToDie, episode);
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
listEps.setMenu( popupmenu);
//Refresh Button
Button refresh = new Button(composite, SWT.PUSH);
refresh.setText("Refresh List");
refresh.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
readEpifile() ;
}
});
//Add New Button
Button addNew = new Button(composite, SWT.PUSH);
addNew.setText("Add New");
addNew.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
lines[1]= "";
lines[2]= "";
openForEdit(lines, true);
}
});
//Label for info
Label info = new Label(composite,SWT.BORDER);
gridData = new GridData(GridData.HORIZONTAL_ALIGN_CENTER);
info.setLayoutData( gridData );
info.setText(" Double Click Item to Edit Item / Right Click to bring up Menu to Delete Item ");
readEpifile();
}
/**
* This method will be called after initialization, in order to grab this
* view composite.
*/
public Composite getComposite() {
return this.composite;
}
public void readEpifile(){
try{
sorter();
listEps.removeAll();
String inputLine1, inputLine2;
String pluginDir = pluginInterface.getPluginDirectoryName();
String eplist_file = pluginDir + System.getProperty("file.separator") + "EpisodeList.txt";
File episodeList = new File (eplist_file);
if (!episodeList.isFile()){
episodeList.createNewFile() ;
}
final BufferedReader in = new BufferedReader(new FileReader(episodeList));
int lineCounter = 1;
int temp1 = 0;
int temp2 = 0;
String[][] epiTemp = new String[1000][2];
while((inputLine1 = in.readLine()) != null){
if((inputLine2 = in.readLine()) != null)
{
epiTemp[temp1][0] = inputLine1;
epiTemp[temp1][1] = inputLine2;
++temp1;
//addTableElementDouble(listEpsTree,inputLine1, inputLine2);
}
}
in.close();
for(int i = 0; i < (temp1 ); i++)
{
addTableElementDouble(listEpsTree, epiTemp[i][0],epiTemp[i][1]);
}
}
catch (Exception e){
}
}
private void addTableElementDouble(final TableTree tableToAdd,final String epiName, final String epiNumber) {
tableCounter = false;
if(display == null || display.isDisposed())
return;
//Some time has passed, and so the table might be disposed
//We must check for it
if(tableToAdd == null || tableToAdd.isDisposed())
return;
int tableTotal = tableToAdd.getItemCount();
if (tableTotal%2==0) {
//System.out.println(tableTotal);
tableCounter=false;
} else {
//System.out.println("miss");
tableCounter=true;
}
TableTreeItem[] items = tableToAdd.getItems();
for (int g = 0; g< items.length ;g++){
if(items[g].toString().endsWith( epiName)){
//System.out.println("poof: match");
return;
}
}
TableTreeItem item = new TableTreeItem(tableToAdd,SWT.NULL);
TableTreeItem subItemURL = new TableTreeItem(item, SWT.NULL);
TableTreeItem subItemComments = new TableTreeItem(item, SWT.NULL);
if (tableCounter == true){
Color gray_color = new Color(display,240,240,240);
item.setBackground( gray_color);
//tableCounter = false;
gray_color.dispose() ;
}
item.setText(0,epiName);
item.setText(1,epiNumber);
subItemURL.setText("URL: ");
subItemComments.setText("Comments: ");
tableCounter = false;
}
public String[] openForEdit(final String lines[], boolean editable){
//Display displayforShell = new Display();
final Shell shell = new Shell(display,SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
//shell.setSize(900,300);
Monitor primary = display.getPrimaryMonitor ();
//Rectangle bounds = primary.getBounds ();
Rectangle bounds = display.getBounds ();
Rectangle rect = shell.getBounds ();
int x = bounds.x + (bounds.width - rect.width) / 2;
int y = bounds.y + (bounds.height - rect.height) / 2;
shell.setLocation (x, y);
GridLayout layout = new GridLayout();
layout.numColumns = 3;
shell.setLayout(layout);
shell.setText("Edit Field");
//Text Line 1
Label seriesLabel = new Label(shell, SWT.NONE);
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = 3;
seriesLabel.setLayoutData( gridData );
seriesLabel.setText("Plugin Name");
final Text line1 = new Text(shell,SWT.BORDER);
gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = 3;
line1.setLayoutData( gridData);
line1.setEditable( editable );
if (editable == false){
shell.setText(lines[1]);
line1.setVisible(false);
}
line1.setText(lines[1]);
//Text Line 2
Label episodeLabel = new Label(shell, SWT.NONE);
gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = 3;
episodeLabel.setLayoutData( gridData );
episodeLabel.setText("ToDo");
final Text line2 = new Text(shell, SWT.BORDER);
gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = 3;
line2.setLayoutData( gridData);
line2.setEditable( true );
line2.setText(lines[2]);
//Button for Commit Changes
Button commit = new Button(shell, SWT.PUSH);
gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = 1;
commit.setLayoutData( gridData);
commit.setText( "Commit Changes");
commit.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
lines[1]=line1.getText();
lines[2]=line2.getText();
if (lines[1] == null){
shell.close();
shell.dispose();
return;
}
if (lines[2] == null){
lines[2] = "Nothing Entered ";
}
epiMaker = new EpiMaker();
epiMaker.commentWriter(pluginInterface, lines);
shell.close() ;
shell.dispose();
readEpifile();
}
});
//Button for Cancel
Button cancel = new Button(shell, SWT.PUSH);
gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = 2;
cancel.setLayoutData( gridData);
cancel.setText("Cancel");
cancel.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
shell.close() ;
shell.dispose() ;
}
});
shell.pack();
shell.open();
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ()) display.sleep ();
}
//display.dispose ();
return lines;
}
public void inLineEdit(final TableTreeEditor editor){
// Clean up any previous editor control
Control oldEditor = editor.getEditor();
if (oldEditor != null)
oldEditor.dispose();
// Identify the selected row
TableTreeItem[] selection = listEpsTree.getSelection();
if (selection.length == 0) return;
final TableTreeItem item = selection[0];
// The control that will be the editor must be a child of the Table
// that underlies the TableTree
final Text text = new Text(listEpsTree.getTable(), SWT.NONE);
//text.moveAbove(tableTree);
//The text editor must have the same size as the cell and must
//not be any smaller than 50 pixels.
editor.horizontalAlignment = SWT.LEFT;
editor.grabHorizontal = true;
//editor.minimumWidth = 50;
// Open the text editor in the second column of the selected row.
editor.setEditor (text, item, 1);
// Assign focus to the text control
text.setText( item.getText(1) );
text.setFocus ();
//Listener for editor
text.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
int escPressed=0;
switch (e.character){
case SWT.CR: escPressed=1;break;
}
if (escPressed == 1){
lines[1] = item.getText(0);
lines[2] = text.getText();
//System.out.println(lines[1] + " | " + lines[2]);
epiMaker = new EpiMaker();
epiMaker.commentWriter(pluginInterface, lines);
Control oldEditor = editor.getEditor();
if (oldEditor != null)
{
oldEditor.dispose();
}
if (!item.isDisposed())
item.setText(1, lines[2]);
}
}
public void keyReleased (KeyEvent e) {
}
});
}
public void deleteFromList(String nameToDie, String episode){
//System.out.println(nameToDie + episode);
epiMaker = new EpiMaker();
epiMaker.commentDelete( pluginInterface, nameToDie);
readEpifile();
}
public void sorter(){
String inputLine1, inputLine2;
String epiNames[] = new String[1000];
String epiEpisodes[] = new String[1000];
int lineCounter = 0;
try {
String pluginDir = pluginInterface.getPluginDirectoryName();
String eplist_file = pluginDir + System.getProperty("file.separator") + "EpisodeList.txt";
File episodeList = new File (eplist_file);
if (!episodeList.isFile()){
episodeList.createNewFile() ;
}
final BufferedReader in = new BufferedReader(new FileReader(episodeList));
while((inputLine1 = in.readLine()) != null){
if((inputLine2 = in.readLine()) != null){
epiNames[lineCounter] = inputLine1;
epiEpisodes[lineCounter] = inputLine2;
lineCounter++;
}
}
in.close();
int epiLength = epiNames.length ;
for ( int i = 0; i < (lineCounter); i++ ){
for ( int j = 0; j < (lineCounter-1); j++ ){
// This does the actual comparison
if ( epiNames[j].compareToIgnoreCase( epiNames [j+1]) > 0 ){
// Swapping
String temp = epiNames[j];
epiNames[j] = epiNames[j+1];
epiNames[j+1] = temp;
String temp2 = epiEpisodes[j];
epiEpisodes[j] = epiEpisodes[j+1];
epiEpisodes[j+1] = temp2;
}
}
}
File episodeList2 = new File (eplist_file);
BufferedWriter bufWriter = new BufferedWriter(new FileWriter(episodeList2));
for (int i=0; i <= lineCounter; i++){
if (epiNames[i] == null){
break;
}
bufWriter.write(epiNames[i] + "\n");
bufWriter.write(epiEpisodes[i] + "\n");
}
bufWriter.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void delete() {
super.delete();
composite.dispose();
}
}