package fr.opensagres.mongodb.ide.ui.editors.database;
import java.util.Collection;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.events.IHyperlinkListener;
import org.eclipse.ui.forms.widgets.FormText;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.forms.widgets.TableWrapData;
import fr.opensagres.mongodb.ide.core.Platform;
import fr.opensagres.mongodb.ide.core.extensions.IShellRunnerType;
import fr.opensagres.mongodb.ide.core.model.Database;
import fr.opensagres.mongodb.ide.core.model.Server;
import fr.opensagres.mongodb.ide.ui.FormLayoutFactory;
import fr.opensagres.mongodb.ide.ui.dialogs.StackTraceErrorDialog;
import fr.opensagres.mongodb.ide.ui.editors.AbstractToolbarFormPage;
import fr.opensagres.mongodb.ide.ui.editors.UIFieldsFactory;
import fr.opensagres.mongodb.ide.ui.internal.ImageResources;
import fr.opensagres.mongodb.ide.ui.internal.Messages;
import fr.opensagres.mongodb.ide.ui.singlesourcing.SingleSourcingUtils;
public class OverviewPage extends AbstractToolbarFormPage implements
IHyperlinkListener {
private static final String STOP_SHELL_IMG = "stop_shell";
private static final String START_SHELL_IMG = "start_shell";
public static final String ID = "overview";
private Label serverLabel;
private Text nameText;
public OverviewPage(DatabaseEditor editor) {
super(editor, ID, Messages.OverviewPage_title);
}
@Override
protected Image getFormTitleImage() {
return ImageResources.getImage(ImageResources.IMG_DATABASE_16);
}
@Override
protected void fillBody(IManagedForm managedForm, FormToolkit toolkit) {
Composite body = managedForm.getForm().getBody();
body.setLayout(FormLayoutFactory.createFormTableWrapLayout(true, 2));
Composite left = toolkit.createComposite(body);
left.setLayout(FormLayoutFactory
.createFormPaneTableWrapLayout(false, 1));
left.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
// General info section
createGeneralInfoSection(left, toolkit);
// right column
Composite right = toolkit.createComposite(body);
right.setLayout(FormLayoutFactory.createFormPaneTableWrapLayout(false,
1));
right.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
// Content section
createContentSection(toolkit, right);
createShellSection(right, toolkit);
initialize();
}
protected void createGeneralInfoSection(Composite left, FormToolkit toolkit) {
Section section = toolkit.createSection(left, Section.DESCRIPTION
| Section.TITLE_BAR);
section.setDescription(Messages.DatabaseEditor_OverviewPage_GeneralInfo_desc);
section.setText(Messages.DatabaseEditor_OverviewPage_GeneralInfo_title);
TableWrapData data = new TableWrapData(TableWrapData.FILL_GRAB);
section.setLayoutData(data);
Composite sbody = toolkit.createComposite(section);
section.setClient(sbody);
GridLayout glayout = new GridLayout();
// glayout.horizontalSpacing = 10;
glayout.numColumns = 2;
sbody.setLayout(glayout);
// Server name
Database database = getDatabase();
Server server = database.getParent();
serverLabel = UIFieldsFactory.createServerField(sbody, toolkit, server);
// Database name
toolkit.createLabel(sbody, Messages.database_label);
nameText = toolkit.createText(sbody, "", SWT.SINGLE);
GridData gd_firstNameText = new GridData(GridData.FILL_HORIZONTAL);
gd_firstNameText.widthHint = 150;
nameText.setLayoutData(gd_firstNameText);
SingleSourcingUtils.FormToolkit_paintBordersFor(toolkit, sbody);
}
/**
* Create Mongo Console Shell section;
*
* @param parent
* @param toolkit
*/
private void createShellSection(Composite parent, FormToolkit toolkit) {
Section section = toolkit.createSection(parent, Section.DESCRIPTION
| Section.TITLE_BAR);
Database database = getDatabase();
section.setDescription(NLS.bind(
Messages.DatabaseEditor_OverviewPage_Shell_desc,
database.getMongoConsoleCommand(false)));
section.setText(Messages.DatabaseEditor_OverviewPage_Shell_title);
TableWrapData data = new TableWrapData(TableWrapData.FILL_GRAB);
section.setLayoutData(data);
Composite container = createStaticSectionClient(toolkit, section);
// List of start/stop of shell runners
String runnersFormtext = generateShellRunnersFormtext();
FormText text = createClient(container, runnersFormtext.toString(),
toolkit, this);
text.setImage(START_SHELL_IMG,
ImageResources.getImage(ImageResources.IMG_ELCL_START_SHELL));
text.setImage(STOP_SHELL_IMG,
ImageResources.getImage(ImageResources.IMG_ELCL_STOP_SHELL));
section.setClient(container);
SingleSourcingUtils.FormToolkit_paintBordersFor(toolkit, container);
}
private String generateShellRunnersFormtext() {
StringBuilder runtimesFormtext = new StringBuilder("<form>");
runtimesFormtext.append("<p>Shell runners:</p>");
Collection<IShellRunnerType> runnerTypes = Platform
.getShellRunnerRegistry().getRunners();
for (IShellRunnerType runnerType : runnerTypes) {
generate(runtimesFormtext, runnerType, true);
if (runnerType.getRunner().canSupportStop()) {
generate(runtimesFormtext, runnerType, false);
}
}
runtimesFormtext.append("</form>");
return runtimesFormtext.toString();
}
private void generate(StringBuilder runnersFormtext,
IShellRunnerType runnerType, boolean start) {
runnersFormtext.append("<li style=\"image\" value=\"");
runnersFormtext.append(start ? START_SHELL_IMG : STOP_SHELL_IMG);
runnersFormtext.append("\" bindent=\"5\" >");
runnersFormtext.append("<a href=\"runner");
runnersFormtext.append(start ? "_start_" : "_stop_");
runnersFormtext.append(runnerType.getId());
runnersFormtext.append("\" >");
runnersFormtext.append(start ? runnerType.getStartName() : runnerType
.getStopName());
runnersFormtext.append("</a>: ");
runnersFormtext.append(start ? runnerType.getStartDescription()
: runnerType.getStopDescription());
runnersFormtext.append("</li>");
}
private void createContentSection(FormToolkit toolkit, Composite parent) {
Section section = toolkit.createSection(parent, Section.TITLE_BAR);
section.setText(Messages.DatabaseEditor_OverviewPage_DatabaseContent_title);
TableWrapData data = new TableWrapData(TableWrapData.FILL_GRAB);
section.setLayoutData(data);
Composite sbody = toolkit.createComposite(section);
section.setClient(sbody);
Composite container = createStaticSectionClient(toolkit, section);
FormText text = createClient(container,
Messages.DatabaseEditor_OverviewPage_DatabaseContent_content,
toolkit, this);
text.setImage("stats_page",
ImageResources.getImage(ImageResources.IMG_STATS_16));
text.setImage("users_page",
ImageResources.getImage(ImageResources.IMG_USERS_16));
text.setImage("indexes_page",
ImageResources.getImage(ImageResources.IMG_INDEX_16));
section.setClient(container);
SingleSourcingUtils.FormToolkit_paintBordersFor(toolkit, sbody);
}
private void initialize() {
Database database = getDatabase();
Server server = database.getParent();
serverLabel.setText(server.getName());
nameText.setText(database.getName());
}
private Database getDatabase() {
return ((DatabaseEditor) getEditor()).getModelObject();
}
public void linkActivated(HyperlinkEvent e) {
String href = (String) e.getHref();
if (href.startsWith("runner_start_")) {
String runnerId = href.substring("runner_start_".length(),
href.length());
try {
Platform.getShellRunnerRegistry().getRunnerType(runnerId)
.getRunner().startShell(getDatabase());
} catch (Exception e1) {
StackTraceErrorDialog.openError(getSite().getShell(), "",
e1.getMessage(), e1);
}
} else if (href.startsWith("runner_stop_")) {
String runnerId = href.substring("runner_stop_".length(),
href.length());
try {
Platform.getShellRunnerRegistry().getRunnerType(runnerId)
.getRunner().stopShell(getDatabase());
} catch (Exception e1) {
StackTraceErrorDialog.openError(getSite().getShell(), "",
e1.getMessage(), e1);
}
} else {
getEditor().setActivePage(href);
}
}
public void linkEntered(HyperlinkEvent e) {
// Do nothing
}
public void linkExited(HyperlinkEvent e) {
// Do nothing
}
}