/**
* This file is part of Archiv-Editor.
*
* The software Archiv-Editor serves as a client user interface for working with
* the Person Data Repository. See: pdr.bbaw.de
*
* The software Archiv-Editor was developed at the Berlin-Brandenburg Academy
* of Sciences and Humanities, Jägerstr. 22/23, D-10117 Berlin.
* www.bbaw.de
*
* Copyright (C) 2010-2013 Berlin-Brandenburg Academy
* of Sciences and Humanities
*
* The software Archiv-Editor was developed by @author: Christoph Plutte.
*
* Archiv-Editor is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Archiv-Editor is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Archiv-Editor.
* If not, see <http://www.gnu.org/licenses/lgpl-3.0.html>.
*/
package org.bbaw.pdr.ae.view.network.views;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Observable;
import java.util.Observer;
import java.util.Vector;
import org.bbaw.pdr.ae.common.AEConstants;
import org.bbaw.pdr.ae.common.NLMessages;
import org.bbaw.pdr.ae.common.utils.OpenExternalBrowser;
import org.bbaw.pdr.ae.control.facade.Facade;
import org.bbaw.pdr.ae.model.Aspect;
import org.bbaw.pdr.ae.model.PdrObject;
import org.bbaw.pdr.ae.model.Relation;
import org.bbaw.pdr.ae.model.RelationStm;
import org.bbaw.pdr.ae.model.view.OrderingHead;
import org.bbaw.pdr.ae.view.control.PDRObjectsProvider;
import org.bbaw.pdr.ae.view.control.PDROrdererFactory;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.browser.LocationEvent;
import org.eclipse.swt.browser.LocationListener;
import org.eclipse.swt.browser.ProgressEvent;
import org.eclipse.swt.browser.ProgressListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.ProgressBar;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.ISelectionService;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
/**
* View of _browser for seeking exterenal person identifier such as pnd, lccn.
* @author cplutte
*/
public class NetworkBrowserViewPart extends ViewPart implements Observer
{
/** Browser. */
private Browser _browser;
private Facade _facade = Facade.getInstanz();
private PDRObjectsProvider _pdrObjectsProvider = new PDRObjectsProvider();
/** The _orderer factory. */
private PDROrdererFactory _ordererFactory = new PDROrdererFactory();
/**
* creates control for view.
* @param parent main composite.
*/
@Override
public final void createPartControl(final Composite parent)
{
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 2;
parent.setLayout(gridLayout);
Label labelAddress = new Label(parent, SWT.NONE);
labelAddress.setText(NLMessages.getString("BrowserViewPart_address"));
final Text location = new Text(parent, SWT.BORDER);
GridData data = new GridData();
data.horizontalAlignment = GridData.FILL;
data.horizontalSpan = 1;
data.grabExcessHorizontalSpace = true;
location.setLayoutData(data);
_browser = new Browser(parent, SWT.NONE);
IWorkbench workbench = PlatformUI.getWorkbench();
IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
ISelection selection = window.getSelectionService().getSelection();
GridData layoutData = new GridData(GridData.FILL_BOTH);
layoutData.horizontalAlignment = SWT.FILL;
layoutData.verticalAlignment = SWT.FILL;
layoutData.horizontalSpan = 2;
layoutData.grabExcessHorizontalSpace = true;
layoutData.grabExcessVerticalSpace = true;
_browser.setLayoutData(layoutData);
// System.out.println("_browser menu items: " +
// _browser.getMenu().getItemCount());
final Label status = new Label(parent, SWT.NONE);
data = new GridData(GridData.FILL_HORIZONTAL);
data.horizontalSpan = 2;
status.setLayoutData(data);
final ProgressBar progressBar = new ProgressBar(parent, SWT.NONE);
data = new GridData();
data.horizontalAlignment = GridData.END;
progressBar.setLayoutData(data);
/* event handling */
Listener listener = new Listener()
{
@Override
public void handleEvent(final Event event)
{
ToolItem item = (ToolItem) event.widget;
String string = item.getText();
// FIXME einkommentieren browser singlesourcen
// if
// (string.equals(NLMessages.getString("BrowserViewPart_back")))
// {
// _browser.back();
// }
// else if
// (string.equals(NLMessages.getString("BrowserViewPart_forward")))
// {
// _browser.forward();
// }
// else if
// (string.equals(NLMessages.getString("BrowserViewPart_stop")))
// {
// _browser.stop();
// }
// else if
// (string.equals(NLMessages.getString("BrowserViewPart_refresh")))
// {
// _browser.refresh();
// }
// else
if (string.equals(NLMessages.getString("BrowserViewPart_go")))
{
_browser.setUrl(location.getText());
}
}
};
_browser.addProgressListener(new ProgressListener()
{
@Override
public void changed(final ProgressEvent event)
{
if (event.total == 0)
{
return;
}
int ratio = event.current * 100 / event.total;
progressBar.setSelection(ratio);
}
@Override
public void completed(final ProgressEvent event)
{
progressBar.setSelection(0);
}
});
// FIXME einkommentieren und singlesourcen
// _browser.addStatusTextListener(new StatusTextListener() {
// public void changed(StatusTextEvent event) {
// status.setText(event.text);
// }
// });
_browser.addLocationListener(new LocationListener()
{
@Override
public void changed(final LocationEvent event)
{
if (event.top)
{
location.setText(event.location);
}
}
@Override
public void changing(final LocationEvent event)
{
}
});
location.addListener(SWT.DefaultSelection, new Listener()
{
@Override
public void handleEvent(final Event e)
{
_browser.setUrl(location.getText());
}
});
setUrlFromSelection(selection);
createSelectionListener();
_facade.addObserver(this);
}
/** creates selection listener in view. */
private void createSelectionListener()
{
IWorkbench workbench = PlatformUI.getWorkbench();
IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
ISelectionService selectionService = window.getSelectionService();
selectionService.addSelectionListener(new ISelectionListener()
{
@Override
public void selectionChanged(final IWorkbenchPart part, final ISelection selection)
{
setUrlFromSelection(selection);
}
});
}
/** sets focus in view. */
@Override
public final void setFocus()
{
_browser.setFocus();
}
/**
* sets url according to selection.
* @param selection selected url.
*/
private void setUrlFromSelection(final ISelection selection)
{
}
public void openURL(String url)
{
if (url != null)
{
_browser.setUrl(url);
}
}
@Override
public final void update(final Observable o, final Object arg)
{
_pdrObjectsProvider.removeAllFilters();
{
if (_facade.getCurrentTreeObjects() != null)
{
}
if (arg.equals("newTreeObjects")) //$NON-NLS-1$ //$NON-NLS-2$
{
loadPdrObjects(_facade.getCurrentTreeObjects());
}
else if (arg.equals("newNewAspect")) //$NON-NLS-1$ //$NON-NLS-2$
{
loadPdrObjects(_facade.getCurrentTreeObjects());
}
else if (arg.equals("refreshAll")) //$NON-NLS-1$
{
}
}
}
private void loadPdrObjects(PdrObject[] currentTreeObjects)
{
_pdrObjectsProvider.setInput(currentTreeObjects);
_pdrObjectsProvider.setOrderer(_ordererFactory.createAspectOrderer("aspect.person"));
Vector<OrderingHead> arrangedAspects = _pdrObjectsProvider.getArrangedAspects();
Vector<String> nodeValues = new Vector<String>(arrangedAspects.size());
StringBuffer nodeNames = new StringBuffer();
StringBuffer links = new StringBuffer();
HashMap<String, Integer> bucketList = new HashMap<String, Integer>();
for (int i = 0; i < arrangedAspects.size(); i++)
{
OrderingHead oh = arrangedAspects.get(i);
nodeValues.add(oh.getValue());
nodeNames.append("\n{nodeName:\"" + oh.getLabel() + "\", group:" + i + "},");
bucketList.put(oh.getValue(), i);
}
if (nodeNames.length() > 1)
{
nodeNames.deleteCharAt(nodeNames.length() - 1);
}
for (int i = 0; i < arrangedAspects.size(); i++)
{
OrderingHead oh = arrangedAspects.get(i);
for (Aspect a : oh.getAspects())
{
if (a.getRelationDim() != null && a.getRelationDim().getRelationStms() != null
&& a.getRelationDim().getRelationStms().size() > 0)
{
for (RelationStm rStm : a.getRelationDim().getRelationStms())
{
if (!rStm.getSubject().toString().equals(oh.getValue()))
{
if (rStm.getRelations() != null && rStm.getRelations().size() > 0)
{
for (Relation rel : rStm.getRelations())
{
if (!rel.getObject().toString().equals(oh.getValue()))
{
links.append("\n{source:" + i + ", target: "
+ bucketList.get(rel.getObject().toString()) + ", value:2},");
}
}
}
}
}
}
}
}
if (links.length() > 1)
{
links.deleteCharAt(links.length() - 1);
}
String output = "var data = { \nnodes:[" + nodeNames + "\n], \nlinks:[" + links.toString() + "]\n};";
String fileName = AEConstants.AE_HOME + AEConstants.FS + "workspace_ae-2.1" + AEConstants.FS
+ "org.bbaw.pdr.ae.view.network" + AEConstants.FS + "web_files" + AEConstants.FS + "protovis"
+ AEConstants.FS + "data" + AEConstants.FS + "data.js";
File f = new File(fileName);
if (!f.exists())
{
try
{
f.createNewFile();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try
{
FileWriter fw = new FileWriter(f);
fw.write(output);
fw.flush();
fw.close();
OpenExternalBrowser.openURL("http://localhost:8080/files/protovis/data/data.html");
// _browser.setUrl("http://localhost:8080/files/protovis/data/data.html");
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void dispose()
{
_facade.deleteObserver(this);
super.dispose();
}
}