package org.chartsy.stockscanpro.ui;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Collection;
import java.util.Iterator;
import java.util.prefs.Preferences;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JEditorPane;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.tree.TreeSelectionModel;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
import org.chartsy.main.managers.ProxyManager;
import org.chartsy.stockscanpro.actions.SaveScansAction;
import org.netbeans.editor.EditorUI;
import org.netbeans.editor.Utilities;
import org.openide.DialogDescriptor;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor.Confirmation;
import org.openide.NotifyDescriptor.InputLine;
import org.openide.explorer.ExplorerManager;
import org.openide.explorer.ExplorerUtils;
import org.openide.explorer.view.BeanTreeView;
import org.openide.loaders.DataFolder;
import org.openide.nodes.Node;
import org.openide.util.Exceptions;
import org.openide.util.Lookup;
import org.openide.util.LookupEvent;
import org.openide.util.LookupListener;
import org.openide.util.NbBundle;
import org.openide.util.NbPreferences;
/**
*
* @author Viorel
*/
public class ScanSaverPanel extends JPanel
implements ExplorerManager.Provider, Lookup.Provider, LookupListener
{
private ExplorerManager manager;
private BeanTreeView treeView;
private JEditorPane editorPane;
private JTextField scanTitle;
private QueryPanel queryPanel;
private Lookup lookup;
private Lookup.Result result;
private DataFolder folder = null;
private DialogDescriptor dialogDescriptor;
public ActionListener saveScan;
public ScanSaverPanel(QueryPanel panel)
{
super(SpringUtilities.getLayout());
setOpaque(false);
queryPanel = panel;
manager = new ExplorerManager();
lookup = ExplorerUtils.createLookup(manager, getActionMap());
manager.setRootContext(SaveScansAction.getRootNode());
initComponents();
}
private void initComponents()
{
JPanel panel;
treeView = new BeanTreeView();
treeView.setRootVisible(false);
treeView.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
treeView.setDragSource(true);
treeView.setUseSubstringInQuickSearch(true);
treeView.setPreferredSize(new Dimension(600, 300));
treeView.setPopupAllowed(false);
add(treeView);
panel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
panel.setOpaque(false);
panel.setPreferredSize(new Dimension(600, 50));
add(panel);
JButton createBtn = new JButton("Create new folder");
createBtn.addActionListener(new CreateFolderAction(this));
panel.add(createBtn);
JButton deleteBtn = new JButton("Delete Folder");
deleteBtn.addActionListener(new DeleteFolderAction(this));
panel.add(deleteBtn);
panel = new JPanel(SpringUtilities.getLayout());
panel.setOpaque(false);
JLabel scanTitleLbl = new JLabel("Scan title:");
panel.add(scanTitleLbl);
scanTitle = new JTextField(100);
scanTitle.setText(queryPanel.getScanTitle());
panel.add(scanTitle);
panel.setPreferredSize(new Dimension(600, 50));
SpringUtilities.makeCompactGrid(panel,
panel.getComponentCount(), 1, // rows, cols
5, 5, // initialX, initialY
5, 5);// xPad, yPad
add(panel);
editorPane = new JEditorPane();
editorPane.setEditable(false);
editorPane.setContentType("text/x-scan");
editorPane.setText(queryPanel.getScan());
EditorUI editorUI = Utilities.getEditorUI(editorPane);
JComponent mainComp = null;
if (editorUI != null)
mainComp = editorUI.getExtComponent();
if (mainComp == null)
mainComp = new javax.swing.JScrollPane(editorPane);
mainComp.setPreferredSize(new Dimension(600, 150));
add(mainComp);
SpringUtilities.makeCompactGrid(this,
getComponentCount(), 1, // rows, cols
5, 5, // initialX, initialY
5, 5);// xPad, yPad
saveScan = new SaveScanAction(this);
}
public void setDialogDescriptor(DialogDescriptor descriptor)
{
dialogDescriptor = descriptor;
}
public DialogDescriptor getDialogDescriptor()
{
return dialogDescriptor;
}
public ExplorerManager getExplorerManager()
{
return manager;
}
public Lookup getLookup()
{
return lookup;
}
public @Override void addNotify()
{
super.addNotify();
ExplorerUtils.activateActions(manager, true);
result = lookup.lookupResult(DataFolder.class);
result.addLookupListener(this);
}
public @Override void removeNotify()
{
ExplorerUtils.activateActions(manager, false);
if (result != null)
{
result.removeLookupListener(this);
result = null;
}
super.removeNotify();
}
public void resultChanged(LookupEvent lookupEvent)
{
Lookup.Result res = (Lookup.Result) lookupEvent.getSource();
Collection collection = res.allInstances();
if (!collection.isEmpty())
{
for (Iterator it = collection.iterator(); it.hasNext();)
folder = (DataFolder) it.next();
}
}
public DataFolder getFolder()
{
return folder;
}
public void refreshRootNode()
{
setRootNode(SaveScansAction.getRootNode());
}
public void setRootNode(Node rootNode)
{
getExplorerManager().setRootContext(rootNode);
}
public String getScanTitle()
{
return scanTitle.getText();
}
public String getScan()
{
return editorPane.getText();
}
class DeleteFolderAction implements ActionListener
{
private ScanSaverPanel scanSaver;
private String responce;
public DeleteFolderAction(ScanSaverPanel scanSaver)
{
this.scanSaver = scanSaver;
}
public void actionPerformed(ActionEvent e)
{
Confirmation descriptor = new DialogDescriptor.Confirmation(
"Are you sure you want to remove this folder?", "Delete Folder");
descriptor.setMessageType(DialogDescriptor.QUESTION_MESSAGE);
descriptor.setOptions(new Object[]
{
DialogDescriptor.OK_OPTION,
DialogDescriptor.CANCEL_OPTION
});
Object ret = DialogDisplayer.getDefault().notify(descriptor);
if (ret.equals(DialogDescriptor.OK_OPTION))
{
final Preferences preferences = NbPreferences.root().node("/org/chartsy/register");
final DataFolder dataFolder = scanSaver.getFolder();
HttpClient client = ProxyManager.getDefault().httpClient();
PostMethod method = new PostMethod(
NbBundle.getMessage(SaveScansAction.class, "StockScanPRO_URL"));
try
{
method.setQueryString(new NameValuePair[]
{
new NameValuePair("option", "com_chartsy"),
new NameValuePair("view", "savescans"),
new NameValuePair("format", "action"),
new NameValuePair("username", preferences.get("username", "")),
new NameValuePair("passwd", preferences.get("password", "")),
new NameValuePair("action", "delete"),
new NameValuePair("folderId", (String) dataFolder.getPrimaryFile().getAttribute("folderId"))
});
client.executeMethod(method);
responce = method.getResponseBodyAsString();
}
catch (IOException ex)
{
Exceptions.printStackTrace(ex);
}
finally
{
method.releaseConnection();
}
if (responce.equals("DELETED"))
{
System.out.println("Folder removed");
scanSaver.refreshRootNode();
}
else
System.out.println("Couldn't remove folder");
}
}
}
class CreateFolderAction implements ActionListener
{
private ScanSaverPanel scanSaver;
private String responce;
public CreateFolderAction(ScanSaverPanel scanSaver)
{
this.scanSaver = scanSaver;
}
public void actionPerformed(ActionEvent e)
{
InputLine descriptor = new DialogDescriptor.InputLine(
"Folder Name:", "Add Folder");
descriptor.setOptions(new Object[]
{
DialogDescriptor.OK_OPTION,
DialogDescriptor.CANCEL_OPTION
});
Object ret = DialogDisplayer.getDefault().notify(descriptor);
if (ret.equals(DialogDescriptor.OK_OPTION))
{
final String folderName = descriptor.getInputText();
if ((folderName != null)
&& (folderName.hashCode() != "".hashCode()))
{
final Preferences preferences = NbPreferences.root().node("/org/chartsy/register");
final DataFolder dataFolder = scanSaver.getFolder();
HttpClient client = ProxyManager.getDefault().httpClient();
PostMethod method = new PostMethod(
NbBundle.getMessage(SaveScansAction.class, "StockScanPRO_URL"));
try
{
method.setQueryString(new NameValuePair[]
{
new NameValuePair("option", "com_chartsy"),
new NameValuePair("view", "savescans"),
new NameValuePair("format", "action"),
new NameValuePair("username", preferences.get("username", "")),
new NameValuePair("passwd", preferences.get("password", "")),
new NameValuePair("action", "add"),
new NameValuePair("folderName", folderName),
new NameValuePair("parentId", (String) dataFolder.getPrimaryFile().getAttribute("folderId"))
});
client.executeMethod(method);
responce = method.getResponseBodyAsString();
}
catch (IOException ex)
{
Exceptions.printStackTrace(ex);
}
finally
{
method.releaseConnection();
}
if (responce.equals("ADDED"))
{
System.out.println("Folder added");
scanSaver.refreshRootNode();
}
else
System.out.println("Couldn't add folder");
}
}
}
}
class SaveScanAction implements ActionListener
{
private ScanSaverPanel scanSaver;
private String responce;
public SaveScanAction(ScanSaverPanel scanSaver)
{
this.scanSaver = scanSaver;
}
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == DialogDescriptor.OK_OPTION)
{
Confirmation descriptor = new DialogDescriptor.Confirmation(
"Are you sure you want to save the scan in this folder?",
"Save Scan");
descriptor.setMessageType(DialogDescriptor.QUESTION_MESSAGE);
descriptor.setOptions(new Object[]
{
DialogDescriptor.OK_OPTION,
DialogDescriptor.CANCEL_OPTION
});
Object ret = DialogDisplayer.getDefault().notify(descriptor);
if (ret.equals(DialogDescriptor.OK_OPTION))
{
Preferences preferences = NbPreferences.root().node("/org/chartsy/register");
DataFolder dataFolder = scanSaver.getFolder();
String username = preferences.get("username", "");
String password = preferences.get("password", "");
String folderId
= (String) dataFolder.getPrimaryFile().getAttribute("folderId");
String scanTitle = encode(scanSaver.getScanTitle());
String scan = encode(scanSaver.getScan());
HttpClient client = ProxyManager.getDefault().httpClient();
PostMethod method = new PostMethod(
NbBundle.getMessage(SaveScansAction.class, "StockScanPRO_URL"));
try
{
method.setQueryString(new NameValuePair[]
{
new NameValuePair("option", "com_chartsy"),
new NameValuePair("view", "savescans"),
new NameValuePair("format", "action"),
new NameValuePair("username", username),
new NameValuePair("passwd", password),
new NameValuePair("action", "save"),
new NameValuePair("folderId", folderId),
new NameValuePair("scanTitle", scanTitle),
new NameValuePair("scan", scan)
});
client.executeMethod(method);
responce = method.getResponseBodyAsString();
}
catch (IOException ex)
{
Exceptions.printStackTrace(ex);
}
finally
{
method.releaseConnection();
}
if (responce.equals("SAVED"))
System.out.println("Scan saved");
else
System.out.println("Couldn't save scan");
}
}
}
public String encode(String text)
{
try
{
return URLEncoder.encode(text, "UTF-8");
}
catch (UnsupportedEncodingException ex)
{
return text;
}
}
}
}