| //------------------------------------------------------------------------------ |
| // Copyright (c) 2005, 2007 IBM Corporation 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: |
| // IBM Corporation - initial implementation |
| //------------------------------------------------------------------------------ |
| package org.eclipse.epf.authoring.ui.dialogs; |
| |
| import java.io.File; |
| import java.util.ArrayList; |
| |
| import org.eclipse.core.runtime.Platform; |
| import org.eclipse.epf.authoring.ui.AuthoringUIResources; |
| import org.eclipse.epf.authoring.ui.AuthoringUIText; |
| import org.eclipse.epf.authoring.ui.filters.AddLinkFilter; |
| import org.eclipse.epf.authoring.ui.richtext.IMethodRichText; |
| import org.eclipse.epf.common.utils.NetUtil; |
| import org.eclipse.epf.library.LibraryService; |
| import org.eclipse.epf.library.edit.IFilter; |
| import org.eclipse.epf.library.edit.itemsfilter.FilterConstants; |
| import org.eclipse.epf.library.ui.LibraryUIResources; |
| import org.eclipse.epf.library.util.ResourceHelper; |
| import org.eclipse.epf.richtext.RichTextEditor; |
| import org.eclipse.epf.richtext.dialogs.AddLinkDialog; |
| import org.eclipse.epf.uma.MethodConfiguration; |
| import org.eclipse.epf.uma.MethodElement; |
| import org.eclipse.epf.uma.MethodPlugin; |
| import org.eclipse.epf.uma.Milestone; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.ModifyEvent; |
| import org.eclipse.swt.events.ModifyListener; |
| import org.eclipse.swt.events.SelectionAdapter; |
| 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.Combo; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Control; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.swt.widgets.FileDialog; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.ui.PlatformUI; |
| |
| /** |
| * Prompts the user to select a link type that will be used to create a HTML anchor |
| * tag in the Rich Text Editor. |
| * |
| * @author Jeff Hardy |
| * @author Kelvin Low |
| * @since 1.0 |
| */ |
| public class MethodAddLinkDialog extends AddLinkDialog { |
| |
| private static final int LINK_URL = 0; |
| |
| private static final int LINK_FILE = LINK_URL + 1; |
| |
| // private static final int LINK_ELEMENT_LINK = LINK_URL + 2; |
| |
| private static final int LINK_ELEMENT_LINK_WITH_TYPE = LINK_URL + 3; |
| |
| private static final int LINK_ELEMENT_LINK_WITH_USER_TEXT = LINK_URL + 4; |
| |
| private static final String[] ELEMENT_TYPE_LABELS = { |
| LibraryUIResources.linkToURL_name, |
| LibraryUIResources.linkToFile_name, |
| LibraryUIResources.elementLink_name, |
| LibraryUIResources.elementLinkWithType_name, |
| LibraryUIResources.elementLinkWithUserText_name }; |
| |
| public static final String OPEN_LINK_IN_NEW_WINDOW_ATTRIBUTE = "target=\"_blank\""; //$NON-NLS-1$ |
| |
| private IMethodRichText richText; |
| |
| private MethodElement methodElement; |
| |
| private String elementLoc; |
| |
| private Combo linkTypeCombo; |
| |
| private Button browseButton; |
| |
| private Button openLinkCheckbox; |
| |
| private int linkType; |
| |
| private boolean openLinkInNewWindow = true; |
| |
| private File fileToCopy; |
| |
| private ModifyListener modifyListener = new ModifyListener() { |
| public void modifyText(ModifyEvent event) { |
| if (okButton != null) { |
| try { |
| if (linkType == LINK_FILE && event.widget == urlText) { |
| File urlFile = new File(urlText.getText().trim()); |
| if (urlFile.isAbsolute()) { |
| fileToCopy = urlFile; |
| } else { |
| fileToCopy = new File(elementLoc, urlText.getText().trim()); |
| } |
| okButton.setEnabled(fileToCopy.isFile() && fileToCopy.canRead()); |
| } else { |
| okButton.setEnabled(urlText.getText().trim().length() > 0); |
| } |
| } catch (Exception e) { |
| okButton.setEnabled(false); |
| } |
| } |
| } |
| }; |
| |
| |
| /** |
| * Creates a new instance. |
| * |
| * @param parent |
| * The parent shell. |
| * @param richText |
| * A rich text control. |
| */ |
| public MethodAddLinkDialog(Shell parent, IMethodRichText richText) { |
| super(parent, richText.getBasePath()); |
| this.richText = richText; |
| this.methodElement = richText.getMethodElement(); |
| elementLoc = ResourceHelper.getFolderAbsolutePath(methodElement); |
| } |
| |
| /** |
| * @see org.eclipse.epf.richtext.dialogs.BaseDialog#createDialogArea(Composite |
| * parent) |
| */ |
| protected Control createDialogArea(Composite parent) { |
| Composite composite = (Composite) super.createDialogArea(parent); |
| GridLayout layout = (GridLayout) composite.getLayout(); |
| layout.numColumns = 3; |
| |
| Label linkTypeLabel = new Label(composite, SWT.NONE); |
| linkTypeLabel.setText(AuthoringUIResources.addLinkDialog_linkType); |
| linkTypeLabel.moveAbove(urlLabel); |
| |
| urlText.removeModifyListener(urlTextModifyListener); |
| urlText.addModifyListener(modifyListener); |
| |
| |
| linkTypeCombo = new Combo(composite, SWT.BORDER | SWT.READ_ONLY); |
| GridData comboGridData = new GridData(GridData.FILL_HORIZONTAL); |
| comboGridData.horizontalSpan = 2; |
| linkTypeCombo.setLayoutData(comboGridData); |
| linkTypeCombo.setItems(ELEMENT_TYPE_LABELS); |
| linkTypeCombo.setText(ELEMENT_TYPE_LABELS[0]); |
| linkTypeCombo.addSelectionListener(new SelectionListener() { |
| public void widgetSelected(SelectionEvent event) { |
| linkType = linkTypeCombo.getSelectionIndex(); |
| browseButton.setEnabled(linkType != LINK_URL); |
| urlDisplayNameLabel.setEnabled(linkType == LINK_URL); |
| urlDisplayNameText.setEnabled(linkType == LINK_URL); |
| if (linkType == LINK_URL) { |
| urlDisplayNameText |
| .setText(richText.getSelected().getText()); |
| } else { |
| urlDisplayNameText.setText(""); //$NON-NLS-1$ |
| } |
| openLinkCheckbox.setEnabled(linkType == LINK_URL |
| || linkType == LINK_FILE); |
| urlText.setText(""); //$NON-NLS-1$ |
| if (linkType != LINK_FILE) { |
| fileToCopy = null; |
| } |
| } |
| |
| public void widgetDefaultSelected(SelectionEvent event) { |
| } |
| }); |
| linkTypeCombo.moveAbove(urlLabel); |
| |
| browseButton = new Button(composite, SWT.PUSH); |
| browseButton.setLayoutData(new GridData()); |
| browseButton.setText(AuthoringUIText.BROWSE_BUTTON_TEXT); |
| browseButton.setEnabled(false); |
| browseButton.addSelectionListener(new SelectionAdapter() { |
| public void widgetSelected(SelectionEvent event) { |
| if (linkType == LINK_FILE) { |
| FileDialog dialog = new FileDialog(Display.getCurrent() |
| .getActiveShell(), SWT.OPEN); |
| dialog.setFilterPath(basePath); |
| String attachFile = dialog.open(); |
| if (attachFile != null && attachFile.length() > 0) { |
| try { |
| File file = new File(dialog.getFilterPath(), dialog |
| .getFileName()); |
| urlText.setText(file.getAbsolutePath()); |
| } catch (Exception e) { |
| logger.logError(e); |
| } |
| } |
| } |
| // MethodElement link |
| else { |
| IFilter filter = new AddLinkFilter() { |
| protected boolean childAccept(Object obj) { |
| if (obj instanceof MethodPlugin) |
| return true; |
| if (obj instanceof MethodConfiguration) |
| return false; |
| if(obj instanceof Milestone) return false; |
| return true; |
| } |
| }; |
| ItemsFilterDialog fd = new ItemsFilterDialog(PlatformUI |
| .getWorkbench().getActiveWorkbenchWindow() |
| .getShell(), filter, methodElement, |
| FilterConstants.ALL_ELEMENTS); |
| fd.setBlockOnOpen(true); |
| fd.setTitle(FilterConstants.ALL_ELEMENTS); |
| fd.open(); |
| ArrayList sel = fd.getSelectedItems(); |
| if (sel.size() > 0) { |
| MethodElement selectedElement = (MethodElement) sel |
| .get(0); |
| String url = null; |
| String href = ResourceHelper.getUrl(selectedElement, |
| methodElement, "html"); //$NON-NLS-1$ |
| if (linkType == LINK_ELEMENT_LINK_WITH_USER_TEXT) { |
| String linkName = ((RichTextEditor) richText) |
| .getSelected().getText(); |
| if (linkName.trim().length() == 0) |
| linkName = selectedElement.getName(); |
| url = ResourceHelper |
| .getElementLink(selectedElement, linkName, |
| "file://" + href); //$NON-NLS-1$ |
| } else { |
| boolean withType = (linkType == LINK_ELEMENT_LINK_WITH_TYPE) ? true |
| : false; |
| url = ResourceHelper |
| .getElementLink(selectedElement, withType, |
| "file://" + href); //$NON-NLS-1$ |
| } |
| urlText.setText(url); |
| } |
| } |
| } |
| }); |
| browseButton.moveAbove(urlDisplayNameLabel); |
| |
| openLinkCheckbox = new Button(composite, SWT.CHECK); |
| GridData checkBoxGridData = new GridData(); |
| checkBoxGridData.horizontalSpan = 2; |
| openLinkCheckbox.setLayoutData(checkBoxGridData); |
| openLinkCheckbox.setText(AuthoringUIResources.openLinkCheckbox_text); |
| openLinkCheckbox.setSelection(true); |
| openLinkCheckbox.addSelectionListener(new SelectionAdapter() { |
| public void widgetSelected(SelectionEvent e) { |
| openLinkInNewWindow = openLinkCheckbox.getSelection(); |
| } |
| }); |
| |
| urlDisplayNameText.setText(richText.getSelected().getText()); |
| |
| return composite; |
| } |
| |
| /** |
| * Returns the file to be copied to a resource folder. |
| */ |
| public File getFileToCopy() { |
| return fileToCopy; |
| } |
| |
| /** |
| * Returns <code>true</code> if the link should be opened in a new browser |
| * window. |
| */ |
| public boolean getOpenLinkInNewWindow() { |
| return openLinkInNewWindow; |
| } |
| |
| /** |
| * Called when the OK button is selected. |
| */ |
| protected void okPressed() { |
| String url = urlText.getText(); |
| if (url != null && url.length() > 0) { |
| if (linkType == LINK_URL) { |
| String urlDisplayName = urlDisplayNameText.getText(); |
| if (urlDisplayName.trim().length() == 0) { |
| urlDisplayName = url; |
| } |
| String fullURL = "<a href=\"" + //$NON-NLS-1$ |
| url |
| + "\"" + //$NON-NLS-1$ |
| (openLinkInNewWindow ? " " + OPEN_LINK_IN_NEW_WINDOW_ATTRIBUTE : "") + //$NON-NLS-1$ //$NON-NLS-2$ |
| ">" + urlDisplayName + "</a>"; //$NON-NLS-1$ //$NON-NLS-2$ |
| link.setURL(fullURL); |
| } else { |
| link.setURL(url); |
| } |
| } |
| |
| // Set widget text to blank so super.okPressed doesn't overwrite the |
| // above. |
| urlText.removeModifyListener(modifyListener); |
| urlText.setText(""); //$NON-NLS-1$ |
| super.okPressed(); |
| } |
| |
| } |