package org.archstudio.launcher.core; import java.io.IOException; import java.util.List; import org.archstudio.eclipse.ui.EclipseUtils; import org.archstudio.eclipse.ui.XadlEditorMatchingStrategy; import org.archstudio.eclipse.ui.views.AbstractArchStudioView; import org.archstudio.filemanager.core.NewFileWizard; import org.archstudio.launcher.ILaunchData; import org.archstudio.resources.ArchStudioCommonResources; import org.archstudio.resources.IResources; import org.archstudio.sysutils.SystemUtils; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DropTarget; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.DropTargetListener; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.dnd.TransferData; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; 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.Event; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.part.ResourceTransfer; public class LauncherView extends AbstractArchStudioView<LauncherMyxComponent> { protected static final String IMAGE_ARCHSTUDIO_LOGO = "launcher:logo/archstudio"; protected static final String IMAGE_NEW_FILE_ICON = "launcher:icon/new-file"; protected static final String IMAGE_ARCHSTUDIO_ICON = "launcher:icon/archstudio"; protected static final String IMAGE_ISR_ICON = "launcher:icon/isr"; private static final String NO_TOOL = "Point mouse cursor at tool for more detail."; protected IResources resources = null; protected List<ILaunchData> launchData = null; public LauncherView() { super(LauncherMyxComponent.class); } @Override public void createPartControl(Composite parent) { resources = brick.getResources(); launchData = brick.getLaunchData(); try { // TODO: clean up this when resources are refactored resources.createImage(IMAGE_ARCHSTUDIO_LOGO, SystemUtils.blt(ArchStudioCommonResources.class.getResourceAsStream("res/archstudio-logo.gif"))); resources .createImage(IMAGE_NEW_FILE_ICON, SystemUtils.blt(ArchStudioCommonResources.class .getResourceAsStream("res/icon-new-file-32x32.gif"))); resources.createImage(IMAGE_ARCHSTUDIO_ICON, SystemUtils.blt(ArchStudioCommonResources.class .getResourceAsStream("res/archstudio-icon-32x32.png"))); resources.createImage(IMAGE_ISR_ICON, SystemUtils.blt(ArchStudioCommonResources.class.getResourceAsStream("res/isr-icon-32x32.gif"))); } catch (IOException ioe) { throw new RuntimeException(ioe); } GridLayout parentLayout = new GridLayout(1, false); parentLayout.marginHeight = 2; parentLayout.verticalSpacing = 2; parentLayout.marginRight = 10; parent.setLayout(parentLayout); parent.setBackground(resources.getColor(IResources.COLOR_ARCHSTUDIO)); Composite cLabels = new Composite(parent, SWT.NONE); cLabels.setBackground(resources.getColor(IResources.COLOR_ARCHSTUDIO)); GridLayout cLabelsLayout = new GridLayout(2, false); cLabelsLayout.marginHeight = 0; cLabels.setLayout(cLabelsLayout); cLabels.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL)); Label lLogo = new Label(cLabels, SWT.NONE); lLogo.setBackground(resources.getColor(IResources.COLOR_ARCHSTUDIO)); lLogo.setImage(resources.getImage(IMAGE_ARCHSTUDIO_LOGO)); Composite cTopButtons = new Composite(cLabels, SWT.NONE); cTopButtons.setBackground(resources.getColor(IResources.COLOR_ARCHSTUDIO)); GridLayout cTopButtonsLayout = new GridLayout(3, true); cTopButtonsLayout.marginHeight = 0; cTopButtons.setLayout(cTopButtonsLayout); cTopButtons.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.GRAB_HORIZONTAL)); Button bNewFile = new Button(cTopButtons, SWT.PUSH | SWT.FLAT); bNewFile.setImage(resources.getImage(IMAGE_NEW_FILE_ICON)); bNewFile.setToolTipText("New Architecture Description"); bNewFile.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.VERTICAL_ALIGN_CENTER | GridData.GRAB_HORIZONTAL)); bNewFile.setAlignment(SWT.CENTER); bNewFile.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { NewFileWizard.showWizard(getSite().getShell(), getSite().getWorkbenchWindow().getWorkbench()); } }); Button bVisitISRWebPage = new Button(cTopButtons, SWT.PUSH | SWT.FLAT); bVisitISRWebPage.setImage(resources.getImage(IMAGE_ISR_ICON)); bVisitISRWebPage.setToolTipText("Visit ISR Website"); bVisitISRWebPage.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.VERTICAL_ALIGN_CENTER | GridData.GRAB_HORIZONTAL)); bVisitISRWebPage.setAlignment(SWT.CENTER); bVisitISRWebPage.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { EclipseUtils.openExternalBrowser("http://www.isr.uci.edu/"); } }); Button bVisitWebPage = new Button(cTopButtons, SWT.PUSH | SWT.FLAT); bVisitWebPage.setImage(resources.getImage(IMAGE_ARCHSTUDIO_ICON)); bVisitWebPage.setToolTipText("Visit ArchStudio Website"); bVisitWebPage.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.VERTICAL_ALIGN_CENTER | GridData.GRAB_HORIZONTAL)); bVisitWebPage.setAlignment(SWT.CENTER); bVisitWebPage.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { EclipseUtils.openExternalBrowser("http://www.isr.uci.edu/projects/archstudio/"); } }); final Group mainGroup = new Group(parent, SWT.NONE); mainGroup.setBackground(resources.getColor(IResources.COLOR_ARCHSTUDIO)); mainGroup.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE)); //mainGroup.setText("Available Tools"); GridData mainGroupData = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL); mainGroupData.horizontalIndent = 20; mainGroupData.verticalIndent = 0; mainGroup.setLayoutData(mainGroupData); mainGroup.setLayout(new GridLayout(1, false)); final Label lExplanation = new Label(mainGroup, SWT.NONE); lExplanation.setBackground(resources.getColor(IResources.COLOR_ARCHSTUDIO)); lExplanation.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE)); lExplanation.setText(NO_TOOL); createToolBar(mainGroup, lExplanation); /* * tb.addListener(SWT.MouseExit, new Listener(){ public void handleEvent(Event event){ * lExplanation.setText(NO_TOOL); mainGroup.layout(new Control[]{lExplanation}); } }); * tb.addListener(SWT.MouseMove, new Listener(){ public void handleEvent(Event event){ ToolItem ti = * tb.getItem(new Point(event.x, event.y)); if((ti != null) && (ti.getData() instanceof ILaunchData)){ * ILaunchData ld = (ILaunchData)ti.getData(); String text = ld.getDescription(); if(ld.getLaunchType() == * ILaunchData.EDITOR){ text += ". Drop a file here to begin."; } else if(ld.getLaunchType() == * ILaunchData.VIEW){ text += ". Click this button to begin."; } lExplanation.setText(text); } else{ * lExplanation.setText(NO_TOOL); } mainGroup.layout(new Control[]{lExplanation}); } }); for(int i = 0; i < * tb.getItemCount(); i++){ ToolItem ti = tb.getItem(i); if(ti.getData() instanceof ILaunchData){ final * ILaunchData ld = (ILaunchData)ti.getData(); ti.addListener(SWT.Selection, new Listener(){ public void * handleEvent(Event event){ if(ld.getLaunchType() == ILaunchData.EDITOR){ IResource[] res = * EclipseUtils.selectResourcesToOpen(getSite().getShell(), SWT.SINGLE, "Choose file to open", new * String[]{"xml"}); if((res != null) && (res.length > 0)){ openEditor(ld, res[0]); } return; } else{ * //TODO:Implement view selection } }; }); } } */ //setupDrop(tb); } protected void createToolBar(Composite parent, Label lDetail) { Composite cBar = new Composite(parent, SWT.NONE); GridLayout cBarLayout = new GridLayout(launchData.size(), false); cBarLayout.marginHeight = 0; cBarLayout.marginWidth = 0; cBarLayout.horizontalSpacing = 2; cBarLayout.verticalSpacing = 0; cBar.setLayout(cBarLayout); cBar.setBackground(resources.getColor(IResources.COLOR_ARCHSTUDIO)); for (ILaunchData launchDataItem : launchData) { createToolItem(cBar, launchDataItem, lDetail); } } protected void createToolItem(Composite parent, final ILaunchData launchData, final Label lDetail) { Composite cItem = new Composite(parent, SWT.NONE); cItem.setLayout(new GridLayout(1, false)); cItem.setBackground(resources.getColor(IResources.COLOR_ARCHSTUDIO)); Button bItem = new Button(cItem, SWT.PUSH); bItem.setImage(launchData.getIcon()); bItem.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_VERTICAL)); bItem.setBackground(resources.getColor(IResources.COLOR_ARCHSTUDIO)); Label lItem = new Label(cItem, SWT.NONE); lItem.setText(launchData.getName()); lItem.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE)); lItem.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER | GridData.GRAB_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER)); lItem.setBackground(resources.getColor(IResources.COLOR_ARCHSTUDIO)); final Control[] controls = new Control[] { lDetail }; bItem.addListener(SWT.MouseExit, new Listener() { @Override public void handleEvent(Event event) { lDetail.setText(NO_TOOL); lDetail.getParent().layout(controls); } }); bItem.addListener(SWT.MouseMove, new Listener() { @Override public void handleEvent(Event event) { String text = launchData.getDescription(); if (launchData.getLaunchType().equals(ILaunchData.LaunchType.EDITOR)) { text += ". Drop a file here to begin."; } else if (launchData.getLaunchType().equals(ILaunchData.LaunchType.VIEW)) { text += ". Click this button to begin."; } lDetail.setText(text); lDetail.getParent().layout(controls); } }); bItem.addSelectionListener(new SelectionListener() { @Override public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } @Override public void widgetSelected(SelectionEvent e) { if (launchData.getLaunchType().equals(ILaunchData.LaunchType.EDITOR)) { IResource[] res = EclipseUtils.selectResourcesToOpen(getSite().getShell(), SWT.SINGLE, "Choose file to open", new String[] { "xml" }); if (res != null && res.length > 0) { openEditor(launchData, res[0]); } return; } else { //TODO: Implement view selection } } }); int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_DEFAULT; DropTarget target = new DropTarget(bItem, operations); final ResourceTransfer resourceTransfer = ResourceTransfer.getInstance(); Transfer[] types = new Transfer[] { resourceTransfer }; target.setTransfer(types); target.addDropListener(new DropTargetListener() { @Override public void dragEnter(DropTargetEvent event) { if (event.detail == DND.DROP_DEFAULT) { if ((event.operations & DND.DROP_COPY) != 0) { event.detail = DND.DROP_COPY; } else { event.detail = DND.DROP_NONE; } } for (TransferData dataType : event.dataTypes) { if (resourceTransfer.isSupportedType(dataType)) { event.currentDataType = dataType; if (event.detail != DND.DROP_COPY) { event.detail = DND.DROP_NONE; } break; } } } @Override public void dragOver(DropTargetEvent event) { event.feedback = DND.FEEDBACK_SELECT | DND.FEEDBACK_SCROLL; if (resourceTransfer.isSupportedType(event.currentDataType)) { if (launchData.getLaunchType().equals(ILaunchData.LaunchType.EDITOR)) { event.detail = DND.DROP_COPY; return; } } event.detail = DND.DROP_NONE; } @Override public void dragOperationChanged(DropTargetEvent event) { if (resourceTransfer.isSupportedType(event.currentDataType)) { if (event.detail != DND.DROP_COPY) { event.detail = DND.DROP_NONE; } } } @Override public void dragLeave(DropTargetEvent event) { } @Override public void dropAccept(DropTargetEvent event) { } @Override public void drop(DropTargetEvent event) { if (resourceTransfer.isSupportedType(event.currentDataType)) { IResource[] resources = (IResource[]) event.data; if (!isValidDrop(resources)) { MessageDialog.openError(getSite().getShell(), "Error", "Invalid input: drop a single valid architecture description to begin."); } else { if (launchData.getLaunchType().equals(ILaunchData.LaunchType.EDITOR)) { openEditor(launchData, resources[0]); return; } } } } private boolean isValidDrop(IResource[] resources) { if (resources.length == 1) { IResource rsrc = resources[0]; IFileEditorInput fei = EclipseUtils.getFileEditorInput(rsrc.getFullPath()); if (fei != null) { XadlEditorMatchingStrategy xadlChecker = new XadlEditorMatchingStrategy(); return xadlChecker.matches(null, fei); } } return false; } }); } protected void openEditor(ILaunchData ld, IResource resource) { if (resource instanceof IFile) { EclipseUtils.openEditor(ld.getEclipseID(), (IFile) resource); } } @Override public void setFocus() { } }