package org.csstudio.sds.ui.sdslibrary.views; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.csstudio.sds.internal.persistence.PersistenceUtil; import org.csstudio.sds.model.DisplayModel; import org.csstudio.sds.ui.SdsUiPlugin; import org.csstudio.sds.ui.internal.actions.WidgetModelTransfer; import org.csstudio.sds.ui.sdslibrary.preferences.LibraryFolderPreferenceItem; import org.csstudio.sds.ui.sdslibrary.preferences.LibraryFolderPreferenceService; import org.csstudio.sds.ui.sdslibrary.preferences.LibraryFolderPreferenceService.LibraryFolderPreferenceChangeListener; import org.csstudio.sds.ui.thumbnail.SdsThumbnailPanel; import org.csstudio.sds.ui.thumbnail.SdsThumbnailPanel.LibraryPanelLayout; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.Path; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DragSource; import org.eclipse.swt.dnd.DragSourceAdapter; import org.eclipse.swt.dnd.DragSourceEvent; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.FileEditorInput; import org.eclipse.ui.part.ViewPart; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SdsLibraryView extends ViewPart { /** * The ID of the view as specified by the extension. */ public static final String ID = "org.csstudio.sds.ui.thumbnailspike.views.SpikeView"; private static final Logger LOG = LoggerFactory.getLogger(SdsLibraryView.class); private final LibraryFolderPreferenceService libraryFolderPreferenceService; private LibraryFolderPreferenceChangeListener preferenceChangeListener; private SdsThumbnailPanel libraryPanel; /** * The constructor. * * @throws FileNotFoundException */ public SdsLibraryView() { libraryFolderPreferenceService = SdsUiPlugin.getDefault() .getLibraryFolderPreferenceService(); } /** * This is a callback that will allow us to create the viewer and initialize * it. */ @Override public void createPartControl(final Composite parent) { parent.setLayout(new FillLayout()); libraryPanel = new SdsThumbnailPanel(parent, SWT.None, LibraryPanelLayout.GroupedGrid); libraryPanel.addMouseListener(new MouseAdapter() { @Override public void mouseDoubleClick(MouseEvent arg0) { try { File selectedFile = libraryPanel.getSelectedFile(); if (selectedFile != null) { IWorkspace workspace = ResourcesPlugin.getWorkspace(); IWorkspaceRoot root = workspace.getRoot(); IFile file = root.getFileForLocation(new Path( selectedFile.getAbsolutePath())); IEditorInput editorInput = new FileEditorInput(file); IWorkbenchWindow window = PlatformUI.getWorkbench() .getActiveWorkbenchWindow(); IWorkbenchPage page = window.getActivePage(); page.openEditor(editorInput, "org.csstudio.sds.ui.internal.editor.DisplayEditor"); } } catch (Exception e) { e.printStackTrace(); } } }); preferenceChangeListener = new LibraryFolderPreferenceChangeListener() { @Override public void preferencesChanged() { createLibraryWidgets(libraryFolderPreferenceService.loadLibraryItems()); } }; libraryFolderPreferenceService.addChangeListener(preferenceChangeListener); initDragAndDrop(); createLibraryWidgets(libraryFolderPreferenceService.loadLibraryItems()); } private void initDragAndDrop() { DragSource dragSource = new DragSource(libraryPanel.getGallery(), DND.DROP_COPY); dragSource.setTransfer(new Transfer[] { WidgetModelTransfer .getInstance() }); SdsLibraryDragSourceEffect effect = new SdsLibraryDragSourceEffect(libraryPanel, getSite().getPage()); dragSource.setDragSourceEffect(effect); dragSource.addDragListener(new DragSourceAdapter() { @Override public void dragStart(DragSourceEvent event) { event.doit = libraryPanel.getSelectedFile() != null; } @Override public void dragSetData(DragSourceEvent event) { DisplayModel model = new DisplayModel(); FileInputStream fip; try { fip = new FileInputStream(libraryPanel.getSelectedFile()); PersistenceUtil.syncFillModel(model, fip); try { fip.close(); } catch (IOException e) { e.printStackTrace(); } } catch (Exception e) { } event.data = model.getWidgets(); } }); } @Override public void dispose() { if (preferenceChangeListener != null) { this.libraryFolderPreferenceService.removeChangeListener(preferenceChangeListener); } super.dispose(); } @Override public void setFocus() { libraryPanel.setFocus(); } private void createLibraryWidgets(List<LibraryFolderPreferenceItem> libraryFolders) { assert libraryFolders != null; List<File> folders = new ArrayList<File>(); String filePathPrefix = ResourcesPlugin.getWorkspace().getRoot() .getRawLocation().toOSString(); for (LibraryFolderPreferenceItem folderItem : libraryFolders) { if (folderItem.isChecked()) { File folder = new File(filePathPrefix + folderItem.getFolderPath()); if(!folder.isDirectory()) { LOG.warn("library preference folder: \""+folder.getAbsolutePath() + "\" does not exist"); } else { folders.add(folder); } } } libraryPanel.setFolders(folders); } @Override protected void finalize() throws Throwable { super.finalize(); } }