package edu.usc.cssl.tacit.common.ui.composite.from;
import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
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.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.IFormColors;
import org.eclipse.ui.forms.IMessage;
import org.eclipse.ui.forms.IMessageManager;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.Form;
import org.eclipse.ui.forms.widgets.FormText;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.Section;
import edu.usc.cssl.tacit.common.ui.ICommonUiConstants;
import edu.usc.cssl.tacit.common.ui.internal.CommonUiViewImageRegistry;
import edu.usc.cssl.tacit.common.ui.internal.TargetLocationsGroup;
import edu.usc.cssl.tacit.common.ui.outputdata.OutputLayoutData;
import edu.usc.cssl.tacit.common.ui.outputdata.TableLayoutData;
import edu.usc.cssl.tacit.common.ui.validation.OutputPathValidation;
import edu.usc.cssl.tacit.common.ui.views.ConsoleView;
public class TacitFormComposite {
private static TargetLocationsGroup targetLocationContent;
public static void createEmptyRow(FormToolkit toolkit,
Composite sectionClient) {
Label dummy = toolkit.createLabel(sectionClient, "", SWT.NONE);
GridDataFactory.fillDefaults().grab(false, false).span(3, 0)
.applyTo(dummy);
}
public static OutputLayoutData createOutputSection(FormToolkit toolkit,
Composite parent, final IMessageManager mmng) {
Section section = toolkit.createSection(parent, Section.TITLE_BAR
| Section.EXPANDED | Section.DESCRIPTION);
GridDataFactory.fillDefaults().grab(true, false).span(1, 1)
.applyTo(section);
GridLayoutFactory.fillDefaults().numColumns(3).applyTo(section);
section.setText("Output Path "); //$NON-NLS-1$
section.setDescription("Choose output path for storing the results");
ScrolledComposite sc = new ScrolledComposite(section, SWT.H_SCROLL
| SWT.V_SCROLL);
sc.setExpandHorizontal(true);
sc.setExpandVertical(true);
GridLayoutFactory.fillDefaults().numColumns(3).equalWidth(false)
.applyTo(sc);
Composite sectionClient = toolkit.createComposite(section);
sc.setContent(sectionClient);
GridDataFactory.fillDefaults().grab(true, false).applyTo(sc);
GridLayoutFactory.fillDefaults().numColumns(3).equalWidth(false)
.applyTo(sectionClient);
section.setClient(sectionClient);
createEmptyRow(toolkit, sectionClient);
final Label outputPathLbl = toolkit.createLabel(sectionClient,
"Output Location:", SWT.NONE);
GridDataFactory.fillDefaults().grab(false, false).span(1, 0)
.applyTo(outputPathLbl);
final Text outputLocationTxt = toolkit.createText(sectionClient, "",
SWT.BORDER);
GridDataFactory.fillDefaults().grab(true, false).span(1, 0)
.applyTo(outputLocationTxt);
final Button browseBtn = toolkit.createButton(sectionClient,
"Browse...", SWT.PUSH);
browseBtn.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
DirectoryDialog dlg = new DirectoryDialog(browseBtn.getShell(),
SWT.OPEN);
dlg.setText("Open");
String path = dlg.open();
if (path == null)
return;
outputLocationTxt.setText(path);
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
}
});
/*
* outputLocationTxt.addFocusListener(new FocusAdapter() {
*
* @Override public void focusLost(FocusEvent e) { super.focusLost(e);
* String message = OutputPathValidation.getInstance()
* .validateOutputDirectory(outputLocationTxt.getText(),"Output"); if
* (message != null) {
*
* message = outputPathLbl.getText() + " " + message;
* mmng.addMessage("location", message, null, IMessageProvider.ERROR); }
* else { mmng.removeMessage("location"); } } });
*/
outputLocationTxt.addKeyListener(new KeyListener() {
@Override
public void keyReleased(KeyEvent e) {
outputPathListener(outputLocationTxt, mmng, outputPathLbl);
}
@Override
public void keyPressed(KeyEvent e) {
outputPathListener(outputLocationTxt, mmng, outputPathLbl);
}
});
OutputLayoutData layoutData = new OutputLayoutData();
layoutData.setOutputLabel(outputLocationTxt);
layoutData.setSectionClient(sectionClient);
return layoutData;
}
protected static void outputPathListener(Text outputLocationTxt,
IMessageManager mmng, Label outputPathLbl) {
if (outputLocationTxt.getText().isEmpty()) {
mmng.addMessage("output",
"Output path must be a valid diretory location", null,
IMessageProvider.ERROR);
return;
}
File tempFile = new File(outputLocationTxt.getText());
if (!tempFile.exists() || !tempFile.isDirectory()) {
mmng.addMessage("output",
"Output path must be a valid diretory location", null,
IMessageProvider.ERROR);
} else {
String message = OutputPathValidation.getInstance()
.validateOutputDirectory(outputLocationTxt.getText(),
"Output");
if (message != null) {
message = outputPathLbl.getText() + " " + message;
mmng.addMessage("output", message, null, IMessageProvider.ERROR);
} else {
mmng.removeMessage("output");
}
}
}
public static OutputLayoutData createInputSection(FormToolkit toolkit,
Composite parent, final IMessageManager mmng) {
Section section = toolkit.createSection(parent, Section.TITLE_BAR
| Section.EXPANDED | Section.DESCRIPTION);
GridDataFactory.fillDefaults().grab(true, false).span(1, 1)
.applyTo(section);
GridLayoutFactory.fillDefaults().numColumns(3).applyTo(section);
section.setText("Input Path "); //$NON-NLS-1$
section.setDescription("Choose input path for storing the results");
ScrolledComposite sc = new ScrolledComposite(section, SWT.H_SCROLL
| SWT.V_SCROLL);
sc.setExpandHorizontal(true);
sc.setExpandVertical(true);
GridLayoutFactory.fillDefaults().numColumns(3).equalWidth(false)
.applyTo(sc);
Composite sectionClient = toolkit.createComposite(section);
sc.setContent(sectionClient);
GridDataFactory.fillDefaults().grab(true, false).applyTo(sc);
GridLayoutFactory.fillDefaults().numColumns(3).equalWidth(false)
.applyTo(sectionClient);
section.setClient(sectionClient);
createEmptyRow(toolkit, sectionClient);
final Label outputPathLbl = toolkit.createLabel(sectionClient,
"Input Location:", SWT.NONE);
GridDataFactory.fillDefaults().grab(false, false).span(1, 0)
.applyTo(outputPathLbl);
final Text outputLocationTxt = toolkit.createText(sectionClient, "",
SWT.BORDER);
GridDataFactory.fillDefaults().grab(true, false).span(1, 0)
.applyTo(outputLocationTxt);
final Button browseBtn = toolkit.createButton(sectionClient,
"Browse...", SWT.PUSH);
browseBtn.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
DirectoryDialog dlg = new DirectoryDialog(browseBtn.getShell(),
SWT.OPEN);
dlg.setText("Open");
String path = dlg.open();
if (path == null)
return;
outputLocationTxt.setText(path);
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
}
});
outputLocationTxt.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
super.focusLost(e);
String message = OutputPathValidation.getInstance()
.validateOutputDirectory(outputLocationTxt.getText(),
"Input");
if (message != null) {
message = outputPathLbl.getText() + " " + message;
mmng.addMessage("inputlocation", message, null,
IMessageProvider.ERROR);
} else {
mmng.removeMessage("inputlocation");
}
}
});
OutputLayoutData layoutData = new OutputLayoutData();
layoutData.setOutputLabel(outputLocationTxt);
layoutData.setSectionClient(sectionClient);
return layoutData;
}
public static TableLayoutData createTableSection(final Composite parent,
FormToolkit toolkit, GridLayout layout, String title,
String description, boolean isFolder, boolean isFile) {
Section section = toolkit.createSection(parent, Section.TWISTIE
| Section.TITLE_BAR);
section.setActiveToggleColor(toolkit.getHyperlinkGroup()
.getActiveForeground());
section.setToggleColor(toolkit.getColors().getColor(
IFormColors.SEPARATOR));
FormText descriptionFrm = toolkit.createFormText(section, false);
descriptionFrm.setText("<form><p>" + description + "</p></form>", true,
false);
section.setDescriptionControl(descriptionFrm);
Composite client = toolkit.createComposite(section, SWT.WRAP);
client.setLayout(layout);
TacitFormComposite.createEmptyRow(toolkit, client);
ScrolledComposite pluginTabContainer = new ScrolledComposite(client,
SWT.H_SCROLL | SWT.V_SCROLL);
pluginTabContainer.setExpandHorizontal(true);
pluginTabContainer.setExpandVertical(true);
GridLayoutFactory.fillDefaults().numColumns(1).equalWidth(false)
.applyTo(pluginTabContainer);
Composite scInput = toolkit.createComposite(pluginTabContainer);
GridLayoutFactory.fillDefaults().numColumns(1).equalWidth(false)
.applyTo(scInput);
pluginTabContainer.setContent(scInput);
GridDataFactory.fillDefaults().grab(true, true).hint(SWT.DEFAULT, 200)
.span(1, 1).applyTo(pluginTabContainer);
targetLocationContent = TargetLocationsGroup.createInForm(scInput,
toolkit, isFolder, isFile);
Label dummyLb1 = toolkit.createLabel(scInput, "", SWT.NONE);
GridDataFactory.fillDefaults().grab(true, false).span(1, 0)
.applyTo(dummyLb1);
section.setText(title);
section.setDescription("<form><p>This section has a <b>tree</b> and a button. It also has <a>a link</a> in the description.</p></form>");
section.setClient(client);
section.setExpanded(true);
GridData gd = new GridData(GridData.FILL_BOTH);
section.setLayoutData(gd);
TableLayoutData layoutData = new TableLayoutData();
layoutData.setSectionClient(client);
layoutData.setTreeViewer(targetLocationContent.getTreeViewer());
return layoutData;
}
public static void updateStatusMessage(final IViewSite site,
final String message, final Integer error, final ScrolledForm form) {
// update status bar
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
if (null == error) {
site.getActionBars().getStatusLineManager()
.setErrorMessage(null);
site.getActionBars().getStatusLineManager()
.setMessage(null);
} else if (error == IStatus.ERROR) {
site.getActionBars()
.getStatusLineManager()
.setErrorMessage(
CommonUiViewImageRegistry
.getImageIconFactory()
.getImage(
ICommonUiConstants.IMAGE_ERROR_SB),
message);
} else if (error == IStatus.INFO) {
site.getActionBars()
.getStatusLineManager()
.setMessage(
CommonUiViewImageRegistry
.getImageIconFactory()
.getImage(
ICommonUiConstants.IMAGE_ERROR_SB),
message);
} else if (error == IStatus.OK) {
site.getActionBars().getStatusLineManager()
.setErrorMessage("");
site.getActionBars()
.getStatusLineManager()
.setMessage(
CommonUiViewImageRegistry
.getImageIconFactory()
.getImage(
ICommonUiConstants.IMAGE_SUCESS_SB),
message);
}
form.setFocus();
}
});
}
public static void addErrorPopup(final Form form, final FormToolkit toolkit) {
form.addMessageHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e) {
String title = e.getLabel();
Object href = e.getHref();
if (href instanceof IMessage[]) {
// details =
// managedForm.getMessageManager().createSummary((IMessage[])href);
}
Point hl = ((Control) e.widget).toDisplay(0, 0);
hl.x += 10;
hl.y += 10;
Shell shell = new Shell(form.getShell(), SWT.ON_TOP | SWT.TOOL);
shell.setImage(getImage(form.getMessageType()));
shell.setText(title);
shell.setLayout(new FillLayout());
// ScrolledFormText stext = new ScrolledFormText(shell, false);
// stext.setBackground(toolkit.getColors().getBackground());
FormText text = toolkit.createFormText(shell, true);
configureFormText(form, text);
// stext.setFormText(text);
if (href instanceof IMessage[])
text.setText(createFormTextContent((IMessage[]) href),
true, false);
shell.setLocation(hl);
shell.pack();
shell.open();
}
});
}
private static Image getImage(int type) {
switch (type) {
case IMessageProvider.ERROR:
return PlatformUI.getWorkbench().getSharedImages()
.getImage(ISharedImages.IMG_OBJS_ERROR_TSK);
case IMessageProvider.WARNING:
return PlatformUI.getWorkbench().getSharedImages()
.getImage(ISharedImages.IMG_OBJS_WARN_TSK);
case IMessageProvider.INFORMATION:
return PlatformUI.getWorkbench().getSharedImages()
.getImage(ISharedImages.IMG_OBJS_INFO_TSK);
}
return null;
}
private static void configureFormText(final Form form, FormText text) {
text.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e) {
String is = (String) e.getHref();
try {
int index = Integer.parseInt(is);
IMessage[] messages = form.getChildrenMessages();
IMessage message = messages[index];
Control c = message.getControl();
((FormText) e.widget).getShell().dispose();
if (c != null)
c.setFocus();
} catch (NumberFormatException ex) {
}
}
});
text.setImage("error", getImage(IMessageProvider.ERROR));
text.setImage("warning", getImage(IMessageProvider.WARNING));
text.setImage("info", getImage(IMessageProvider.INFORMATION));
}
private static String createFormTextContent(IMessage[] messages) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
pw.println("<form>");
for (int i = 0; i < messages.length; i++) {
IMessage message = messages[i];
pw.print("<li vspace=\"false\" style=\"image\" indent=\"16\" value=\"");
switch (message.getMessageType()) {
case IMessageProvider.ERROR:
pw.print("error");
break;
case IMessageProvider.WARNING:
pw.print("warning");
break;
case IMessageProvider.INFORMATION:
pw.print("info");
break;
}
pw.print("\"> <a href=\"");
pw.print(i + "");
pw.print("\">");
if (message.getPrefix() != null)
pw.print(message.getPrefix());
pw.print(message.getMessage());
pw.println("</a>");
pw.println("</li>");
}
pw.println("</form>");
pw.flush();
return sw.toString();
}
public static void setConsoleViewInFocus() {
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
try {
PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getActivePage().showView(ConsoleView.ID);
} catch (PartInitException e1) {
}
}
});
}
public static void writeConsoleHeaderBegining(String statusText) {
final DateFormat dateFormat = new SimpleDateFormat(
"MMM dd, yyyy, HH:mm:ss aaa");
final Calendar cal = Calendar.getInstance();
ConsoleView.writeInConsoleHeader(statusText
+ (dateFormat.format(cal.getTime())));
}
}