From: <pat...@us...> - 2011-03-07 19:35:17
|
Revision: 1237 http://cishell.svn.sourceforge.net/cishell/?rev=1237&view=rev Author: pataphil Date: 2011-03-07 19:35:10 +0000 (Mon, 07 Mar 2011) Log Message: ----------- * Tried to implement drag-and-dropping into the tool. See wiki for notes on this. Modified Paths: -------------- trunk/clients/gui/org.cishell.reference.gui.datamanager/META-INF/MANIFEST.MF trunk/clients/gui/org.cishell.reference.gui.datamanager/src/org/cishell/reference/gui/datamanager/AbstractDataManagerView.java trunk/clients/gui/org.cishell.reference.gui.datamanager/src/org/cishell/reference/gui/datamanager/DataGUIItem.java Added Paths: ----------- trunk/clients/gui/org.cishell.reference.gui.datamanager/src/org/cishell/reference/gui/datamanager/CIShellDataTransfer.java Modified: trunk/clients/gui/org.cishell.reference.gui.datamanager/META-INF/MANIFEST.MF =================================================================== --- trunk/clients/gui/org.cishell.reference.gui.datamanager/META-INF/MANIFEST.MF 2011-03-07 19:18:57 UTC (rev 1236) +++ trunk/clients/gui/org.cishell.reference.gui.datamanager/META-INF/MANIFEST.MF 2011-03-07 19:35:10 UTC (rev 1237) @@ -8,11 +8,13 @@ org.eclipse.core.runtime Import-Package: org.cishell.app.service.datamanager;version="1.0.0", org.cishell.app.service.fileloader, + org.cishell.app.service.filesaver, org.cishell.framework;version="1.0.0", org.cishell.framework.algorithm;version="1.0.0", org.cishell.framework.data;version="1.0.0", org.cishell.reference.gui.datamanager, org.cishell.reference.gui.workspace, + org.cishell.service.conversion;version="1.0.0", org.cishell.service.guibuilder;version="1.0.0", org.cishell.utilities, org.osgi.service.log;version="1.3.0" Modified: trunk/clients/gui/org.cishell.reference.gui.datamanager/src/org/cishell/reference/gui/datamanager/AbstractDataManagerView.java =================================================================== --- trunk/clients/gui/org.cishell.reference.gui.datamanager/src/org/cishell/reference/gui/datamanager/AbstractDataManagerView.java 2011-03-07 19:18:57 UTC (rev 1236) +++ trunk/clients/gui/org.cishell.reference.gui.datamanager/src/org/cishell/reference/gui/datamanager/AbstractDataManagerView.java 2011-03-07 19:35:10 UTC (rev 1237) @@ -50,6 +50,9 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.custom.TreeEditor; import org.eclipse.swt.dnd.DND; +import org.eclipse.swt.dnd.DragSource; +import org.eclipse.swt.dnd.DragSourceEvent; +import org.eclipse.swt.dnd.DragSourceListener; import org.eclipse.swt.dnd.DropTarget; import org.eclipse.swt.dnd.DropTargetAdapter; import org.eclipse.swt.dnd.DropTargetEvent; @@ -98,7 +101,7 @@ private boolean updatingTreeItem; private Tree tree; private Menu menu; - private Map<Data, DataGUIItem> dataToDataGUIItemMap; + private Map<Data, DataGUIItem> dataToDataGUIItem; private AlgorithmFactory saveFactory; private AlgorithmFactory viewFactory; private AlgorithmFactory viewWithFactory; @@ -110,7 +113,7 @@ public AbstractDataManagerView(String brandPluginID) { this.brandPluginID = brandPluginID; - this.dataToDataGUIItemMap = new HashMap<Data, DataGUIItem>(); + this.dataToDataGUIItem = new HashMap<Data, DataGUIItem>(); this.manager = Activator.getDataManagerService(); this.logger = Activator.getLogService(); @@ -204,6 +207,11 @@ } private void setupDataManagerViewForDragAndDrop(Composite parent) { + setupDataManagerViewForDragAndDropInto(parent); + setupDataManagerViewForDragAndDropOutOf(parent); + } + + private void setupDataManagerViewForDragAndDropInto(Composite parent) { DropTarget dropTarget = new DropTarget(parent.getParent(), DND.DROP_DEFAULT | DND.DROP_MOVE); dropTarget.setTransfer(new Transfer[] { FileTransfer.getInstance() }); @@ -273,6 +281,34 @@ }); } + private void setupDataManagerViewForDragAndDropOutOf(Composite parent) { + Transfer[] types = new Transfer[] { new CIShellDataTransfer(Activator.context) }; + DragSource dragSource = new DragSource(parent, DND.DROP_DEFAULT | DND.DROP_MOVE); + dragSource.setTransfer(types); + dragSource.addDragListener(new DragSourceListener() { + private Data[] selectedData; + + public void dragStart(DragSourceEvent event) { + System.err.println("dragStart"); + Data[] selectedData = AbstractDataManagerView.this.manager.getSelectedData(); + + if ((selectedData != null) && (selectedData.length != 0)) { + event.doit = true; + this.selectedData = selectedData; + } + } + + public void dragSetData(DragSourceEvent event) { + // TODO: Create the target files. +// event.data = + } + + public void dragFinished(DragSourceEvent event) { + // TODO: Convert the source files, given the target files. + } + }); + } + private Collection<File> flattenDraggedFileStructures(String[] fileNames) { Collection<File> flattenedFileStructure = new ArrayList<File>(); @@ -337,7 +373,7 @@ /* Keep a reference to the new model in the model->TreeItem mapping so that it can be used * in the future if it has a child. */ - this.dataToDataGUIItemMap.put(newData, newItem); + this.dataToDataGUIItem.put(newData, newItem); // update the ModelManager with the new selection final Set<Data> selection = new HashSet<Data>(); @@ -370,7 +406,7 @@ parentItem = this.rootItem; } else { // Otherwise find the associated DataModelGUIItem for the parent. - parentItem = this.dataToDataGUIItemMap.get(parent); + parentItem = this.dataToDataGUIItem.get(parent); // The parent may not be in the GUI. If its not, then use root item. if (parentItem == null) { @@ -419,6 +455,7 @@ for (int i = 0; i < data.length; ++i) { TreeItem[] treeItems = tree.getItems(); +// tree.getSelection() for (int j = 0; j < treeItems.length; ++j) { if (treeItems[j].getData() == data[i]) { itemSet.add(treeItems[j]); @@ -427,6 +464,7 @@ } } + // TODO: Add dnd listeners to itemSet elements (if necessary) tree.setSelection(itemSet.toArray(new TreeItem[0])); getSite().getSelectionProvider().setSelection(new StructuredSelection(data)); } @@ -700,7 +738,7 @@ parent.removeChild(item); } - AbstractDataManagerView.this.dataToDataGUIItemMap.remove(item.getModel()); + AbstractDataManagerView.this.dataToDataGUIItem.remove(item.getModel()); AbstractDataManagerView.this.manager.removeData(item.getModel()); } @@ -774,7 +812,7 @@ (Data) next, AbstractDataManagerView.this.tree.getItems()); newTreeSelection[i] = result; AbstractDataManagerView.this.viewer.expandToLevel( - AbstractDataManagerView.this.dataToDataGUIItemMap.get(next), 0); + AbstractDataManagerView.this.dataToDataGUIItem.get(next), 0); } i++; Added: trunk/clients/gui/org.cishell.reference.gui.datamanager/src/org/cishell/reference/gui/datamanager/CIShellDataTransfer.java =================================================================== --- trunk/clients/gui/org.cishell.reference.gui.datamanager/src/org/cishell/reference/gui/datamanager/CIShellDataTransfer.java (rev 0) +++ trunk/clients/gui/org.cishell.reference.gui.datamanager/src/org/cishell/reference/gui/datamanager/CIShellDataTransfer.java 2011-03-07 19:35:10 UTC (rev 1237) @@ -0,0 +1,91 @@ +package org.cishell.reference.gui.datamanager; + +import java.io.File; + +import org.cishell.app.service.filesaver.FileSaveException; +import org.cishell.app.service.filesaver.FileSaverService; +import org.cishell.framework.data.Data; +import org.cishell.service.conversion.ConversionException; +import org.cishell.service.conversion.Converter; +import org.eclipse.swt.dnd.ByteArrayTransfer; +import org.eclipse.swt.dnd.FileTransfer; +import org.eclipse.swt.dnd.TransferData; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; + +/* I'm calling this CIShellDataTransfer to make it clear that it's domain-specific. + */ +public class CIShellDataTransfer extends ByteArrayTransfer { + public static final String TYPE_NAME = "CIShellData"; + public static final int TYPE_ID = registerType(TYPE_NAME); + + private BundleContext bundleContext; + + public CIShellDataTransfer(BundleContext bundleContext) { + this.bundleContext = bundleContext; + } + + public void javaToNative(Object object, TransferData transferData) { + System.err.println(String.format( + "javaToNative: %s (%s) %s", object, object.getClass().getName(), transferData)); + if ((object == null) || !(object instanceof Data[])) { + return; + } + + if (isSupportedType(transferData)) { + Data[] data = (Data[]) object; + Data[] convertedData = convertData(data); + String[] convertedFilePaths = formConvertedFilePaths(convertedData); + FileTransfer.getInstance().javaToNative(convertedFilePaths, transferData); + } + } + + public Object nativeToJava(TransferData transferData) { + // TODO: I probably won't get to implementing this. Maybe throw an exception? + return null; + } + + protected String[] getTypeNames() { + return new String[] { TYPE_NAME }; + } + + protected int[] getTypeIds() { + return new int[] { TYPE_ID }; + } + + private Data[] convertData(Data[] data) { + Data[] convertedData = new Data[data.length]; + + for (int ii = 0; ii < data.length; ii++) { + try { + convertedData[ii] = convertDatum(data[ii]); + } catch (Throwable e) { + // TODO: Log this. + } + } + + return convertedData; + } + + private Data convertDatum(Data datum) throws ConversionException, FileSaveException { + ServiceReference fileSaverServiceReference = + this.bundleContext.getServiceReference(FileSaverService.class.getName()); + FileSaverService fileSaver = + (FileSaverService) this.bundleContext.getService(fileSaverServiceReference); + + Converter converter = + fileSaver.promptForConverter(datum, FileSaverService.ANY_FILE_EXTENSION); + + return converter.convert(datum); + } + + private String[] formConvertedFilePaths(Data[] convertedData) { + String[] convertedFilePaths = new String[convertedData.length]; + + for (int ii = 0; ii < convertedData.length; ii++) { + convertedFilePaths[ii] = ((File) convertedData[ii].getData()).getAbsolutePath(); + } + + return convertedFilePaths; + } +} \ No newline at end of file Modified: trunk/clients/gui/org.cishell.reference.gui.datamanager/src/org/cishell/reference/gui/datamanager/DataGUIItem.java =================================================================== --- trunk/clients/gui/org.cishell.reference.gui.datamanager/src/org/cishell/reference/gui/datamanager/DataGUIItem.java 2011-03-07 19:18:57 UTC (rev 1236) +++ trunk/clients/gui/org.cishell.reference.gui.datamanager/src/org/cishell/reference/gui/datamanager/DataGUIItem.java 2011-03-07 19:35:10 UTC (rev 1237) @@ -8,8 +8,8 @@ import java.io.File; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; -import java.util.List; import java.util.Map; import org.cishell.framework.data.Data; @@ -29,11 +29,10 @@ * @author Team IVC */ public class DataGUIItem { - private String brandPluginID; //images for the defined types - private Image matrixIcon; +// private Image matrixIcon; private Image treeIcon; private Image networkIcon; private Image unknownIcon; @@ -46,9 +45,8 @@ private Image modelIcon; private Image rIcon; - private Map typeToImageMapping; - - private List children; + private Map<String, Image> typeToImage = new HashMap<String, Image>(); + private Collection<DataGUIItem> children = new ArrayList<DataGUIItem>(); private Data data; private DataGUIItem parent; @@ -62,10 +60,9 @@ public DataGUIItem(Data data, DataGUIItem parent, String brandPluginID) { this.data = data; this.parent = parent; - children = new ArrayList(); this.brandPluginID = brandPluginID; - matrixIcon = getImage("matrix.png", this.brandPluginID); +// matrixIcon = getImage("matrix.png", this.brandPluginID); treeIcon = getImage("tree.png", this.brandPluginID); networkIcon = getImage("network.png", this.brandPluginID); unknownIcon = getImage("unknown.png", this.brandPluginID); @@ -78,7 +75,6 @@ modelIcon = getImage("model.jpg", this.brandPluginID); rIcon = getImage("r.png", this.brandPluginID); - typeToImageMapping = new HashMap(); registerImage(DataProperty.OTHER_TYPE, unknownIcon); /******************************************** @@ -127,7 +123,7 @@ * @param item the new child of this DataModelGUIItem */ public void addChild(DataGUIItem item) { - children.add(item); + this.children.add(item); } /** @@ -136,7 +132,7 @@ * @return an array of all of the children of this DataModelGUIItem */ public Object[] getChildren() { - return children.toArray(); + return this.children.toArray(); } /** @@ -146,7 +142,7 @@ * @param item the child of this DataModelGUIItem to remove */ public void removeChild(DataGUIItem item) { - children.remove(item); + this.children.remove(item); } /** @@ -154,43 +150,46 @@ * * @return the icon associated with this DataModel for display in IVC */ - public Image getIcon(){ - Image icon = (Image)typeToImageMapping.get(data.getMetadata().get(DataProperty.TYPE)); - if(icon == null) icon = unknownIcon; + public Image getIcon() { + Image icon = this.typeToImage.get(data.getMetadata().get(DataProperty.TYPE)); + + if (icon == null) { + icon = unknownIcon; + } + return icon; } - public void registerImage(String type, Image image){ - typeToImageMapping.put(type, image); + public void registerImage(String type, Image image) { + this.typeToImage.put(type, image); } - - - - public static Image getImage(String name, String brandPluginID){ - if(Platform.isRunning()) { - String imageLocation = File.separator + "icons" + File.separator + name; - ImageDescriptor imageDescriptor = AbstractUIPlugin.imageDescriptorFromPlugin( - brandPluginID, - imageLocation); + + public static Image getImage(String name, String brandPluginID) { + if (Platform.isRunning()) { + String imageLocation = + String.format("%sicons%s%s", File.separator, File.separator, name); + ImageDescriptor imageDescriptor = + AbstractUIPlugin.imageDescriptorFromPlugin(brandPluginID, imageLocation); + if (imageDescriptor != null) { return imageDescriptor.createImage(); } else { - System.err.println("Could not find the icon " + - "'" + imageLocation + "'" + - "in" + - "'" + brandPluginID + "'." + - "Using the default image instead."); + String errorMessage = String.format( + "Could not find the icon '%s' in '%s'. Using the default image instead.", + imageLocation, + brandPluginID); + System.err.println(errorMessage); + return getDefaultImage(); } - } - else { - System.err.println("Could not obtain the image " + - "'" + name + "'" + - "in" + - "'" + brandPluginID + "'" + - ", since the platform was not running (?)." + - "Using the default image instead."); + } else { + String format = + "Could not obtain the image '%s' in '%s', since the platform was not " + + "running (?). Using the default image instead."; + String errorMessage = String.format(format, name, brandPluginID); + System.err.println(errorMessage); + return getDefaultImage(); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |