| /******************************************************************************* |
| * Copyright (c) 2008, 2011 Aleksandra Wozniak and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Aleksandra Wozniak (aleksandra.k.wozniak@gmail.com) - initial implementation |
| * IBM Corporation - Bug 73923 (major refactoring and adjustments) |
| * IBM Corporation - Bug 241649 - [Dialogs] Resizing of the "compare with other" dialog |
| *******************************************************************************/ |
| package org.eclipse.compare.internal; |
| |
| import java.io.FileOutputStream; |
| import java.io.IOException; |
| |
| import org.eclipse.compare.CompareConfiguration; |
| import org.eclipse.compare.CompareUI; |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IFolder; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IProjectDescription; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.IWorkspaceRoot; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.jface.dialogs.IDialogConstants; |
| import org.eclipse.jface.dialogs.IDialogSettings; |
| import org.eclipse.jface.dialogs.IMessageProvider; |
| import org.eclipse.jface.dialogs.MessageDialog; |
| import org.eclipse.jface.dialogs.TitleAreaDialog; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.StructuredSelection; |
| import org.eclipse.swt.SWT; |
| 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.DropTargetEvent; |
| import org.eclipse.swt.dnd.DropTargetListener; |
| import org.eclipse.swt.dnd.TextTransfer; |
| import org.eclipse.swt.dnd.Transfer; |
| import org.eclipse.swt.events.ModifyEvent; |
| import org.eclipse.swt.events.ModifyListener; |
| 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.DirectoryDialog; |
| import org.eclipse.swt.widgets.Event; |
| import org.eclipse.swt.widgets.FileDialog; |
| import org.eclipse.swt.widgets.Group; |
| import org.eclipse.swt.widgets.Listener; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.swt.widgets.Text; |
| import org.eclipse.ui.forms.events.ExpansionAdapter; |
| import org.eclipse.ui.forms.events.ExpansionEvent; |
| import org.eclipse.ui.forms.widgets.ExpandableComposite; |
| import org.eclipse.ui.part.ResourceTransfer; |
| |
| /** |
| * This is a dialog that can invoke the compare editor on chosen files. |
| */ |
| public class CompareWithOtherResourceDialog extends TitleAreaDialog { |
| |
| private int MIN_WIDTH = 320; |
| private int MIN_HEIGHT_WITH_ANCESTOR = 320; |
| private int MIN_HEIGHT_WITHOUT_ANCESTOR = 238; |
| |
| private class FileTextDragListener implements DragSourceListener { |
| |
| private ContentTypeElement element; |
| |
| public FileTextDragListener(ContentTypeElement element) { |
| this.element = element; |
| } |
| |
| public void dragFinished(DragSourceEvent event) { |
| element.setText(""); //$NON-NLS-1$ |
| } |
| |
| public void dragSetData(DragSourceEvent event) { |
| event.data = element.getText(); |
| } |
| |
| public void dragStart(DragSourceEvent event) { |
| if (element.getText() == null) |
| event.doit = false; |
| } |
| } |
| |
| private class FileTextDropListener implements DropTargetListener { |
| |
| private ContentTypeElement element; |
| private ResourceTransfer resourceTransfer; |
| private TextTransfer textTransfer; |
| |
| public FileTextDropListener(ContentTypeElement element) { |
| this.element = element; |
| resourceTransfer = ResourceTransfer.getInstance(); |
| textTransfer = TextTransfer.getInstance(); |
| } |
| |
| 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 (int i = 0; i < event.dataTypes.length; i++) { |
| if (resourceTransfer.isSupportedType(event.dataTypes[i]) |
| || textTransfer.isSupportedType(event.dataTypes[i])) { |
| event.currentDataType = event.dataTypes[i]; |
| if (event.detail != DND.DROP_COPY) |
| event.detail = DND.DROP_NONE; |
| break; |
| } |
| } |
| } |
| |
| public void dragLeave(DropTargetEvent event) { |
| // intentionally empty |
| } |
| |
| public void dragOperationChanged(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; |
| } else if (resourceTransfer.isSupportedType(event.currentDataType)) { |
| if (event.detail != DND.DROP_COPY) |
| event.detail = DND.DROP_NONE; |
| } |
| } |
| |
| public void dragOver(DropTargetEvent event) { |
| // intentionally empty |
| } |
| |
| public void drop(DropTargetEvent event) { |
| |
| if (textTransfer.isSupportedType(event.currentDataType)) { |
| String txt = (String) event.data; |
| IResource r = ResourcesPlugin.getWorkspace().getRoot().findMember(txt); |
| if (r != null) |
| element.setResource(r); |
| } else if (resourceTransfer.isSupportedType(event.currentDataType)) { |
| IResource[] files = (IResource[]) event.data; |
| if (files.length > 0) |
| element.setResource(files[0]); |
| } |
| |
| } |
| |
| public void dropAccept(DropTargetEvent event) { |
| // intentionally empty |
| } |
| |
| } |
| |
| private abstract class ContentTypeElement { |
| |
| private Button radioButton; |
| protected Button mainButton; |
| protected Text text; |
| private String type; |
| protected InternalSection section; |
| private IResource resource; |
| |
| public ContentTypeElement(Composite parent, String type, InternalSection section) { |
| this.type = type; |
| this.section = section; |
| createContents(parent); |
| } |
| |
| private void createContents(Composite parent) { |
| createRadioButton(parent); |
| createText(parent); |
| createMainButton(parent); |
| } |
| |
| private void createRadioButton(Composite parent) { |
| radioButton = new Button(parent, SWT.RADIO); |
| radioButton.setText(type); |
| } |
| |
| protected void createText(Composite parent) { |
| text = new Text(parent, SWT.BORDER); |
| text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); |
| text.setEditable(false); |
| } |
| |
| protected void createMainButton(Composite parent) { |
| mainButton = new Button(parent, SWT.PUSH); |
| mainButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); |
| } |
| |
| protected Button getRadioButton() { |
| return radioButton; |
| } |
| |
| protected String getText() { |
| return text.getText(); |
| } |
| |
| protected void setText(String string) { |
| text.setText(string); |
| } |
| |
| protected void setEnabled(boolean enabled) { |
| radioButton.setSelection(enabled); |
| mainButton.setEnabled(enabled); |
| text.setEnabled(enabled); |
| } |
| |
| protected void setResource(IResource resource) { |
| this.resource = resource; |
| section.setResource(resource); |
| } |
| |
| public IResource getResource() { |
| return resource; |
| } |
| |
| void clearResource() { |
| resource = null; |
| text.setText(""); //$NON-NLS-1$ |
| } |
| |
| } |
| |
| private class WorkspaceContent extends ContentTypeElement { |
| |
| public WorkspaceContent(Composite parent, InternalSection section) { |
| super(parent, CompareMessages.CompareWithOtherResourceDialog_workspaceRadioButton, section); |
| } |
| |
| protected void createMainButton(Composite parent) { |
| super.createMainButton(parent); |
| mainButton.setText(CompareMessages.CompareWithOtherResourceDialog_workspaceMainButton); |
| // temporarily hide this button. For more information about supporting for browsing workspace see bug 243744. |
| mainButton.setVisible(false); |
| } |
| |
| protected void createText(Composite parent) { |
| |
| super.createText(parent); |
| text.setEditable(true); |
| |
| text.addModifyListener(new ModifyListener() { |
| public void modifyText(ModifyEvent e) { |
| section.setResource(text.getText()); |
| updateErrorInfo(); |
| } |
| }); |
| |
| text.addSelectionListener(new SelectionListener() { |
| public void widgetDefaultSelected(SelectionEvent e) { |
| widgetSelected(e); |
| } |
| public void widgetSelected(SelectionEvent e) { |
| section.setResource(text.getText()); |
| updateErrorInfo(); |
| } |
| }); |
| |
| initDrag(); |
| initDrop(); |
| } |
| |
| protected void setResource(IResource resource) { |
| super.setResource(resource); |
| text.setText(resource.getFullPath().toOSString()); |
| } |
| |
| protected void initDrag() { |
| DragSource source = new DragSource(text, DND.DROP_MOVE |
| | DND.DROP_COPY | DND.DROP_DEFAULT); |
| Transfer[] types = new Transfer[] { TextTransfer.getInstance(), |
| ResourceTransfer.getInstance() }; |
| source.setTransfer(types); |
| source.addDragListener(new FileTextDragListener(this)); |
| } |
| |
| protected void initDrop() { |
| DropTarget target = new DropTarget(text, DND.DROP_MOVE |
| | DND.DROP_COPY | DND.DROP_DEFAULT); |
| Transfer[] types = new Transfer[] { TextTransfer.getInstance(), |
| ResourceTransfer.getInstance() }; |
| target.setTransfer(types); |
| target.addDropListener(new FileTextDropListener(this)); |
| } |
| |
| } |
| |
| private class ExternalFileContent extends ContentTypeElement { |
| |
| public ExternalFileContent(Composite parent, InternalSection section) { |
| super(parent, CompareMessages.CompareWithOtherResourceDialog_externalFileRadioButton, section); |
| } |
| |
| protected void createMainButton(Composite parent) { |
| super.createMainButton(parent); |
| mainButton.setText(CompareMessages.CompareWithOtherResourceDialog_externalFileMainButton); |
| mainButton.addSelectionListener(new SelectionListener() { |
| public void widgetDefaultSelected(SelectionEvent e) { |
| widgetSelected(e); |
| } |
| public void widgetSelected(SelectionEvent e) { |
| IResource r = tmpProject.getExternalFile(); |
| if (r == null) |
| return; |
| setResource(r); |
| } |
| }); |
| } |
| |
| protected void setResource(IResource resource) { |
| super.setResource(resource); |
| text.setText(resource.getLocation().toOSString()); |
| } |
| |
| } |
| |
| private class ExternalFolderContent extends ContentTypeElement { |
| |
| public ExternalFolderContent(Composite parent, InternalSection section) { |
| super(parent, CompareMessages.CompareWithOtherResourceDialog_externalFolderRadioButton, section); |
| } |
| |
| protected void createMainButton(Composite parent) { |
| super.createMainButton(parent); |
| mainButton.setText(CompareMessages.CompareWithOtherResourceDialog_externalFolderMainButton); |
| mainButton.addSelectionListener(new SelectionListener() { |
| public void widgetDefaultSelected(SelectionEvent e) { |
| widgetSelected(e); |
| } |
| public void widgetSelected(SelectionEvent e) { |
| IResource r = tmpProject.getExternalFolder(); |
| if (r == null) |
| return; |
| setResource(r); |
| } |
| }); |
| } |
| |
| protected void setResource(IResource resource) { |
| super.setResource(resource); |
| text.setText(resource.getLocation().toOSString()); |
| } |
| |
| } |
| |
| private abstract class InternalSection { |
| |
| // there is no "enum" support in Java 1.4. Sigh... |
| public static final int WORKSPACE = 0; |
| public static final int EXTERNAL_FILE = 1; |
| public static final int EXTERNAL_FOLDER = 2; |
| |
| protected Group group; |
| private IResource resource; |
| |
| ExternalFileContent externalFileContent; |
| ExternalFolderContent externalFolderContent; |
| WorkspaceContent workspaceContent; |
| |
| private InternalSection() { |
| // not to instantiate |
| } |
| |
| protected void createContents(Composite parent) { |
| |
| group = new Group(parent, SWT.NONE); |
| group.setLayout(new GridLayout(3, false)); |
| group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); |
| |
| workspaceContent = new WorkspaceContent(group, this); |
| externalFileContent = new ExternalFileContent(group, this); |
| externalFolderContent = new ExternalFolderContent(group, this); |
| |
| addListenersToRadioButtons(); |
| } |
| |
| private void addListenersToRadioButtons() { |
| final ContentTypeElement[] elements = new ContentTypeElement[] { workspaceContent, |
| externalFileContent, externalFolderContent }; |
| for (int i = 0; i < elements.length; i++) { |
| elements[i].getRadioButton().addListener(SWT.Selection, new Listener() { |
| public void handleEvent(Event event) { |
| for (int j = 0; j < elements.length; j++) { |
| if (event.widget != elements[j].getRadioButton()) |
| elements[j].setEnabled(false); |
| else { |
| elements[j].setEnabled(true); |
| setResource(elements[j].getResource()); |
| } |
| } |
| } |
| }); |
| } |
| } |
| |
| protected IResource getResource() { |
| return resource; |
| } |
| |
| protected void setResource(IResource resource) { |
| this.resource = resource; |
| updateErrorInfo(); |
| } |
| |
| protected void setResource(String s) { |
| IResource tmp = ResourcesPlugin.getWorkspace().getRoot() |
| .findMember(s); |
| if (tmp instanceof IWorkspaceRoot) |
| resource = null; |
| else |
| resource = tmp; |
| updateErrorInfo(); |
| } |
| |
| protected void clearResource() { |
| resource = null; |
| workspaceContent.clearResource(); |
| externalFileContent.clearResource(); |
| externalFolderContent.clearResource(); |
| updateErrorInfo(); |
| } |
| |
| protected void setContentType(int type) { |
| switch(type) { |
| case WORKSPACE: |
| workspaceContent.setEnabled(true); |
| externalFileContent.setEnabled(false); |
| externalFolderContent.setEnabled(false); |
| break; |
| case EXTERNAL_FILE: |
| workspaceContent.setEnabled(false); |
| externalFileContent.setEnabled(true); |
| externalFolderContent.setEnabled(false); |
| break; |
| case EXTERNAL_FOLDER: |
| workspaceContent.setEnabled(false); |
| externalFileContent.setEnabled(false); |
| externalFolderContent.setEnabled(true); |
| } |
| } |
| } |
| |
| private class InternalGroup extends InternalSection { |
| |
| public InternalGroup(Composite parent) { |
| createContents(parent); |
| } |
| |
| public void setText(String text) { |
| group.setText(text); |
| } |
| |
| public void setLayoutData(GridData layoutData) { |
| group.setLayoutData(layoutData); |
| } |
| } |
| |
| private class InternalExpandable extends InternalSection { |
| |
| private ExpandableComposite expandable; |
| private Button clearButton; |
| |
| public InternalExpandable(Composite parent) { |
| createContents(parent); |
| } |
| |
| protected void createContents(Composite parent) { |
| final Composite p = parent; |
| expandable = new ExpandableComposite(parent, SWT.NONE, |
| ExpandableComposite.TREE_NODE | ExpandableComposite.TWISTIE); |
| super.createContents(expandable); |
| createClearButton(group); |
| expandable.setClient(group); |
| expandable.addExpansionListener(new ExpansionAdapter() { |
| public void expansionStateChanged(ExpansionEvent e) { |
| p.layout(); |
| adjustSize(e.getState()); |
| } |
| }); |
| } |
| |
| private void createClearButton(Composite parent) { |
| clearButton = new Button(parent, SWT.PUSH); |
| clearButton.setText(CompareMessages.CompareWithOtherResourceDialog_clear); |
| clearButton.addSelectionListener(new SelectionListener() { |
| public void widgetDefaultSelected(SelectionEvent e) { |
| widgetSelected(e); |
| } |
| public void widgetSelected(SelectionEvent e) { |
| clearResource(); |
| } |
| }); |
| } |
| |
| public void setText(String text) { |
| expandable.setText(text); |
| group.setText(text); |
| } |
| |
| public void setLayoutData(GridData layoutData) { |
| expandable.setLayoutData(layoutData); |
| } |
| } |
| |
| private class ExternalResourcesProject { |
| |
| // Implementation based on org.eclipse.jdt.internal.core.ExternalFoldersManager |
| |
| private int counter = 0; |
| |
| private static final String TMP_PROJECT_NAME = ".org.eclipse.compare.tmp"; //$NON-NLS-1$ |
| |
| private final static String TMP_PROJECT_FILE = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" //$NON-NLS-1$ |
| + "<projectDescription>\n" //$NON-NLS-1$ |
| + "\t<name>" + TMP_PROJECT_NAME + "\t</name>\n" //$NON-NLS-1$ //$NON-NLS-2$ |
| + "\t<comment></comment>\n" //$NON-NLS-1$ |
| + "\t<projects>\n" //$NON-NLS-1$ |
| + "\t</projects>\n" //$NON-NLS-1$ |
| + "\t<buildSpec>\n" //$NON-NLS-1$ |
| + "\t</buildSpec>\n" //$NON-NLS-1$ |
| + "\t<natures>\n" + "\t</natures>\n" //$NON-NLS-1$//$NON-NLS-2$ |
| + "</projectDescription>"; //$NON-NLS-1$ |
| |
| private final static String TMP_FOLDER_NAME = "tmpFolder"; //$NON-NLS-1$ |
| |
| private ExternalResourcesProject() { |
| // nothing to do here |
| } |
| |
| private IProject createTmpProject() throws CoreException { |
| IProject project = getTmpProject(); |
| if (!project.isAccessible()) { |
| try { |
| IPath stateLocation = CompareUI.getPlugin().getStateLocation(); |
| if (!project.exists()) { |
| IProjectDescription desc = project.getWorkspace() |
| .newProjectDescription(project.getName()); |
| desc.setLocation(stateLocation.append(TMP_PROJECT_NAME)); |
| project.create(desc, null); |
| } |
| try { |
| project.open(null); |
| } catch (CoreException e) { // in case .project file or folder has been deleted |
| IPath projectPath = stateLocation.append(TMP_PROJECT_NAME); |
| projectPath.toFile().mkdirs(); |
| FileOutputStream output = new FileOutputStream( |
| projectPath.append(".project").toOSString()); //$NON-NLS-1$ |
| try { |
| output.write(TMP_PROJECT_FILE.getBytes()); |
| } finally { |
| output.close(); |
| } |
| project.open(null); |
| } |
| getTmpFolder(project); |
| } catch (IOException ioe) { |
| return project; |
| } catch (CoreException ce) { |
| throw new CoreException(ce.getStatus()); |
| } |
| } |
| project.setHidden(true); |
| return project; |
| } |
| |
| private IFolder getTmpFolder(IProject project) throws CoreException { |
| IFolder folder = project.getFolder(TMP_FOLDER_NAME); |
| if (!folder.exists()) |
| folder.create(IResource.NONE, true, null); |
| return folder; |
| } |
| |
| private IFile getExternalFile() { |
| FileDialog dialog = new FileDialog(getShell()); |
| String path = dialog.open(); |
| if (path != null) |
| return (IFile) linkResource(new Path(path)); |
| return null; |
| } |
| |
| private IFolder getExternalFolder() { |
| DirectoryDialog dialog = new DirectoryDialog(getShell()); |
| String path = dialog.open(); |
| if (path != null) |
| return (IFolder) linkResource(new Path(path)); |
| return null; |
| } |
| |
| private IResource linkResource(IPath path) { |
| IResource r = null; |
| String resourceName = path.lastSegment(); |
| try { |
| IProject project = createTmpProject(); |
| if (!project.isOpen()) |
| project.open(null); |
| if (path.toFile().isFile()) { |
| r = getTmpFolder(project).getFile(resourceName); |
| if (r.exists()) { // add a number to file's name when there already is a file with that name in a folder |
| String extension = path.getFileExtension(); |
| String fileName = path.removeFileExtension().lastSegment(); |
| r = getTmpFolder(project).getFile(getName(fileName, extension)); |
| } |
| ((IFile)r).createLink(path, IResource.REPLACE, null); |
| } else { // isDirectory |
| r = getTmpFolder(project).getFolder(resourceName); |
| if (r.exists()) { |
| r = getTmpFolder(project).getFolder(getName(resourceName, null)); |
| } |
| ((IFolder)r).createLink(path, IResource.REPLACE, null); |
| } |
| } catch (CoreException e) { |
| CompareUIPlugin.log(e); |
| MessageDialog.openError(getShell(), |
| CompareMessages.CompareWithOtherResourceDialog_externalFile_errorTitle, |
| CompareMessages.CompareWithOtherResourceDialog_externalFile_errorMessage); |
| } |
| return r; |
| } |
| |
| /** |
| * This method is used to prevent duplicating names of linked resources. |
| * It adds a suffix based on the <code>counter</code> value. |
| * |
| * @param name |
| * @param extension optional |
| * @return |
| */ |
| private String getName(String name, String extension) { |
| if (counter != 0) { |
| name = name + "-" + counter; //$NON-NLS-1$ |
| } |
| // at most 3 resources at the same time with the same name: |
| // left, right, ancestor |
| counter = (counter + 1) % 3; |
| if (extension != null) { |
| name += "." + extension; //$NON-NLS-1$ |
| } |
| // don't change the name if counter equals 0 |
| return name; |
| } |
| |
| private IProject getTmpProject() { |
| return ResourcesPlugin.getWorkspace().getRoot().getProject( |
| TMP_PROJECT_NAME); |
| } |
| } |
| |
| private Button okButton; |
| private InternalGroup rightPanel, leftPanel; |
| private InternalExpandable ancestorPanel; |
| private ISelection selection; |
| private ExternalResourcesProject tmpProject = new ExternalResourcesProject(); |
| |
| /** |
| * Creates the dialog. |
| * |
| * @param shell |
| * a shell |
| * @param selection |
| * if the selection is not null, it will be set as initial files |
| * for comparison |
| * @since 3.4 |
| */ |
| protected CompareWithOtherResourceDialog(Shell shell, ISelection selection) { |
| super(shell); |
| setShellStyle(SWT.MODELESS | SWT.RESIZE | SWT.MAX); |
| this.selection = selection; |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see |
| * org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets |
| * .Composite) |
| */ |
| protected Control createDialogArea(Composite parent) { |
| |
| Composite mainPanel = new Composite(parent, SWT.NULL); |
| mainPanel.setLayout(new GridLayout(1, true)); |
| mainPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); |
| |
| ancestorPanel = new InternalExpandable(mainPanel); |
| ancestorPanel.setText(CompareMessages.CompareWithOtherResourceDialog_ancestor); |
| GridData ancestorGD = new GridData(SWT.FILL, SWT.FILL, true, false); |
| ancestorPanel.setLayoutData(ancestorGD); |
| |
| leftPanel = new InternalGroup(mainPanel); |
| leftPanel.setText(CompareMessages.CompareWithOtherResourceDialog_leftPanel); |
| leftPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); |
| |
| rightPanel = new InternalGroup(mainPanel); |
| rightPanel.setText(CompareMessages.CompareWithOtherResourceDialog_rightPanel); |
| rightPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); |
| |
| setSelection(selection); |
| getShell().setText(CompareMessages.CompareWithOtherResourceDialog_dialogTitle); |
| setTitle(CompareMessages.CompareWithOtherResourceDialog_dialogMessage); |
| adjustSize(ancestorPanel.expandable.isExpanded()); |
| |
| return mainPanel; |
| } |
| |
| private void adjustSize(boolean expanded) { |
| int minWidth = convertHorizontalDLUsToPixels(MIN_WIDTH); |
| int minHeight = convertVerticalDLUsToPixels(expanded ? MIN_HEIGHT_WITH_ANCESTOR |
| : MIN_HEIGHT_WITHOUT_ANCESTOR); |
| getShell().setMinimumSize(minWidth, minHeight); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see |
| * org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse |
| * .swt.widgets.Composite) |
| */ |
| protected void createButtonsForButtonBar(Composite parent) { |
| super.createButtonsForButtonBar(parent); |
| okButton = getButton(IDialogConstants.OK_ID); |
| updateErrorInfo(); |
| setMessage(CompareMessages.CompareWithOtherResourceDialog_info); |
| } |
| |
| private void setSelection(ISelection selection) { |
| IResource[] selectedResources = Utilities.getResources(selection); |
| switch (selectedResources.length) { |
| case 1: |
| leftPanel.workspaceContent.setResource(selectedResources[0]); |
| break; |
| case 2: |
| leftPanel.workspaceContent.setResource(selectedResources[0]); |
| rightPanel.workspaceContent.setResource(selectedResources[1]); |
| break; |
| case 3: |
| ancestorPanel.workspaceContent.setResource(selectedResources[0]); |
| ancestorPanel.expandable.setExpanded(true); |
| leftPanel.workspaceContent.setResource(selectedResources[1]); |
| rightPanel.workspaceContent.setResource(selectedResources[2]); |
| break; |
| } |
| setInitialContentTypes(); |
| } |
| |
| private void setInitialContentTypes() { |
| ancestorPanel.setContentType(InternalSection.WORKSPACE); |
| leftPanel.setContentType(InternalSection.WORKSPACE); |
| rightPanel.setContentType(InternalSection.WORKSPACE); |
| } |
| |
| private boolean isComparePossible() { |
| IResource[] resources; |
| if (ancestorPanel.getResource() == null) |
| resources = new IResource[] { leftPanel.getResource(), |
| rightPanel.getResource() }; |
| else |
| resources = new IResource[] { ancestorPanel.getResource(), |
| leftPanel.getResource(), rightPanel.getResource() }; |
| |
| ResourceCompareInput r = new ResourceCompareInput( |
| new CompareConfiguration()); |
| return r.isEnabled(new StructuredSelection(resources)); |
| } |
| |
| private void updateErrorInfo() { |
| if (okButton != null) { |
| if (leftPanel.getResource() == null |
| || rightPanel.getResource() == null) { |
| setMessage(CompareMessages.CompareWithOtherResourceDialog_error_empty, |
| IMessageProvider.ERROR); |
| okButton.setEnabled(false); |
| } else if (!isComparePossible()) { |
| setMessage( |
| CompareMessages.CompareWithOtherResourceDialog_error_not_comparable, |
| IMessageProvider.ERROR); |
| okButton.setEnabled(false); |
| } else { |
| setMessage(CompareMessages.CompareWithOtherResourceDialog_info); |
| okButton.setEnabled(true); |
| } |
| } |
| } |
| |
| /** |
| * Returns table with selected resources. If any resource wasn't chosen in |
| * the ancestor panel, table has only two elements -- resources chosen in |
| * left and right panel. In the other case table contains all three |
| * resources. |
| * |
| * @return table with selected resources |
| */ |
| public IResource[] getResult() { |
| IResource[] resources; |
| IResource rightResource = rightPanel.getResource(); |
| IResource leftResource = leftPanel.getResource(); |
| IResource ancestorResource = ancestorPanel.getResource(); |
| if (ancestorResource == null) |
| resources = new IResource[] { leftResource, rightResource }; |
| else |
| resources = new IResource[] { ancestorResource, leftResource, |
| rightResource }; |
| return resources; |
| } |
| |
| /* |
| * @see org.eclipse.jface.dialogs.Dialog#getDialogBoundsSettings() |
| */ |
| protected IDialogSettings getDialogBoundsSettings() { |
| String sectionName = getClass().getName() + "_dialogBounds"; //$NON-NLS-1$ |
| IDialogSettings settings = CompareUIPlugin.getDefault() |
| .getDialogSettings(); |
| IDialogSettings section = settings.getSection(sectionName); |
| if (section == null) |
| section = settings.addNewSection(sectionName); |
| return section; |
| } |
| |
| } |