package ru.runa.specific.of;
import java.util.Set;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.Hyperlink;
import org.jbpm.ui.DesignerLogger;
import org.jbpm.ui.dialog.TreeItem;
import org.jbpm.ui.dialog.TreeViewSelectionDialog;
import org.jbpm.ui.orgfunctions.OrgFunctionDefinition;
import org.jbpm.ui.orgfunctions.SwimlaneElement;
import org.jbpm.ui.sync.SyncSettingsWizardPage;
import org.jbpm.ui.sync.SyncUIHelper;
import ru.runa.specific.of.RunaOrgStructureImporter.Actor;
import ru.runa.specific.of.RunaOrgStructureImporter.Department;
import ru.runa.specific.of.RunaOrgStructureImporter.Firm;
import ru.runa.specific.res.Messages;
public class SwimlaneRunaOrgStructureElement extends SwimlaneElement {
private Hyperlink chooseExecutorLink;
private Text selectionText;
public SwimlaneRunaOrgStructureElement() {
setOrgFunctionDefinitionName("ExecutorByCodeFunction");
}
@Override
public void createGUI(Composite parent) {
Composite clientArea = createSection(parent, 1);
SyncUIHelper.createHeader(getClientArea(), RunaOrgStructureImporter.getInstance());
Composite content = new Composite(clientArea, SWT.NONE);
content.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
content.setLayout(new GridLayout(2, false));
selectionText = new Text(content, SWT.READ_ONLY | SWT.BORDER);
selectionText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
chooseExecutorLink = createLink(content, org.jbpm.ui.resource.Messages.getString("button.choose"));
chooseExecutorLink.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e) {
try {
TreeViewSelectionDialog dialog = new TreeViewSelectionDialog(Messages.getString("RunaOrgDialog.Text"));
dialog.setItems(getAsTree());
if (dialog.open() == IDialogConstants.OK_ID) {
TreeItem treeItem = dialog.getSelectedItem();
selectionText.setText(treeItem.getLabel());
selectionText.setForeground(treeItem.getColor());
OrgFunctionDefinition definition = createNew();
definition.getParameters().get(0).setValue((String) treeItem.getTag());
fireCompletedEvent(definition);
}
} catch (Exception ex) {
DesignerLogger.logError("Unable to load executors", ex);
}
}
});
}
private Set<Firm> getFirmsTree() throws Exception {
return (Set<Firm>) RunaOrgStructureImporter.getInstance().loadCachedData();
}
private Actor getActorByCode(int id) throws Exception {
Set<Firm> firms = getFirmsTree();
for (Firm firm : firms) {
for (Department department : firm.departments) {
for (Actor actor : department.actors) {
if (actor.id == id) {
return actor;
}
}
}
}
return null;
}
private TreeItem getAsTree() throws Exception {
Set<Firm> firms = getFirmsTree();
TreeItem root = new TreeItem("Root");
for (Firm firm : firms) {
TreeItem firmItem = new TreeItem(firm.name);
root.addChild(firmItem);
for (Department department : firm.departments) {
TreeItem departmentItem = new TreeItem(department.shortName);
firmItem.addChild(departmentItem);
for (Actor actor : department.actors) {
TreeItem actorItem = new TreeItem(actor.name);
actorItem.setAllowSelection(true);
actorItem.setTag(String.valueOf(actor.id));
actorItem.setColor(actor.getForeground());
departmentItem.addChild(actorItem);
}
}
}
return root;
}
@Override
public void open(String path, String swimlaneName, OrgFunctionDefinition definition) {
super.open(path, swimlaneName, definition);
String value = "";
if (currentDefinition != null && currentDefinition.getParameters().size() > 0) {
value = currentDefinition.getParameters().get(0).getValue();
}
try {
int actorId = Integer.parseInt(value);
Actor actor = getActorByCode(actorId);
if (actor != null) {
value = actor.name;
selectionText.setForeground(actor.getForeground());
}
} catch (Exception e) {
// ignore for presentation
}
selectionText.setText(value);
}
public static class TimingsSettingsPage extends SyncSettingsWizardPage {
public TimingsSettingsPage() {
super(RunaOrgStructureImporter.getInstance(), Messages.getString("RunaOrgDialog.Header"));
}
@Override
public void createControl(Composite parent) {
super.createControl(parent);
addTextField(TimingsConnectionResources.HOST, Messages.getString("RunaOrgDialog.HostPropName"), "rm_workflow", Messages.getString("example") + ": 'rm_workflow'");
addTextField(TimingsConnectionResources.PORT, Messages.getString("RunaOrgDialog.PortPropName"), "8080", Messages.getString("example") + ": '8080'");
addTextField(TimingsConnectionResources.SERVLET_URL, Messages.getString("RunaOrgDialog.URLPropName"), "/timings/employeeOrgStructureServlet.do", Messages.getString("example") + ": '/timings/employeeOrgStructureServlet.do'");
addTextField(TimingsConnectionResources.PAST_DAYS_PERIOD, Messages.getString("RunaOrgDialog.PastDays"), Messages.getString("RunaOrgDialog.PastDays.Desc"));
}
@Override
protected boolean testConnection() {
// TODO properties.put(ConnectionResources.TEST_CONNECTION, "true");
return super.testConnection();
}
}
}