blob: 367b25b97132c163d61711d62930a419ef3b08b4 [file] [log] [blame]
//------------------------------------------------------------------------------
// 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 <a>
* 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();
}
}