/*
* Copyright 2011-2012 Amazon Technologies, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://aws.amazon.com/apache2.0
*
* This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
* OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and
* limitations under the License.
*/
package com.amazonaws.eclipse.explorer.cloudfront;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.resource.JFaceResources;
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.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.part.EditorPart;
import com.amazonaws.eclipse.core.AWSClientFactory;
import com.amazonaws.eclipse.core.AwsToolkitCore;
import com.amazonaws.eclipse.core.ui.IRefreshable;
import com.amazonaws.eclipse.core.ui.WebLinkListener;
import com.amazonaws.eclipse.explorer.AbstractAwsResourceEditorInput;
import com.amazonaws.services.cloudfront.AmazonCloudFront;
public abstract class AbstractDistributionEditor extends EditorPart implements IRefreshable {
private static final String ACCESS_LOGGING_DOCUMENTATION_URL = "http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html";
private static final String CNAME_DOCUMENTATION_URL = "http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/CNAMEs.html";
private AbstractAwsResourceEditorInput editorInput;
protected Text domainNameText;
protected Text distributionIdText;
protected Text lastModifiedText;
protected Text enabledText;
protected Text statusText;
protected Text commentText;
protected Label defaultRootObjectLabel;
protected Text originText;
protected Text loggingEnabledText;
protected Text loggingBucketText;
protected Text loggingPrefixText;
protected org.eclipse.swt.widgets.List cnamesList;
private ScrolledForm form;
protected boolean supportsDefaultRootObjects() {
return true;
}
protected abstract void contributeActions(IToolBarManager iToolBarManager);
protected abstract String getResourceTitle();
@Override
public void doSave(IProgressMonitor monitor) {}
@Override
public void doSaveAs() {}
@Override
public boolean isDirty() {
return false;
}
@Override
public boolean isSaveAsAllowed() {
return false;
}
@Override
public void setFocus() {}
@Override
public void init(IEditorSite site, IEditorInput input) throws PartInitException {
setSite(site);
setInput(input);
setPartName(input.getName());
this.editorInput = (AbstractAwsResourceEditorInput)input;
}
@Override
public void createPartControl(Composite parent) {
FormToolkit toolkit = new FormToolkit(Display.getDefault());
form = toolkit.createScrolledForm(parent);
form.setFont(JFaceResources.getHeaderFont());
form.setText(getResourceTitle() + " " + editorInput.getName());
toolkit.decorateFormHeading(form.getForm());
form.setImage(getTitleImage());
form.getBody().setLayout(new GridLayout());
createDistributionSummaryComposite(toolkit, form.getBody());
form.reflow(true);
refreshData();
contributeActions(form.getToolBarManager());
form.getToolBarManager().add(new Separator());
form.getToolBarManager().add(new RefreshAction());
form.getToolBarManager().update(true);
}
protected void createDistributionSummaryComposite(FormToolkit toolkit, Composite parent) {
GridDataFactory gdf = GridDataFactory.swtDefaults()
.align(SWT.FILL, SWT.TOP)
.grab(true, false);
GridDataFactory sectionGDF = GridDataFactory.swtDefaults()
.span(2, 1)
.grab(true, false)
.align(SWT.FILL, SWT.TOP)
.indent(0, 10);
Composite summaryComposite = toolkit.createComposite(parent);
summaryComposite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
summaryComposite.setLayout(new GridLayout(2, false));
toolkit.createLabel(summaryComposite, "Domain Name:");
domainNameText = createText(summaryComposite);
gdf.applyTo(domainNameText);
toolkit.createLabel(summaryComposite, "Distribution ID:");
distributionIdText = createText(summaryComposite);
gdf.applyTo(distributionIdText);
toolkit.createLabel(summaryComposite, "Origin:");
originText = createText(summaryComposite);
gdf.applyTo(originText);
toolkit.createLabel(summaryComposite, "Enabled:");
enabledText = createText(summaryComposite);
gdf.applyTo(enabledText);
toolkit.createLabel(summaryComposite, "Status:");
statusText = createText(summaryComposite);
gdf.applyTo(statusText);
toolkit.createLabel(summaryComposite, "Last Modified:");
lastModifiedText = createText(summaryComposite);
gdf.applyTo(lastModifiedText);
toolkit.createLabel(summaryComposite, "Comment:");
commentText = createText(summaryComposite);
gdf.applyTo(commentText);
if (supportsDefaultRootObjects()) {
toolkit.createLabel(summaryComposite, "Default Root Object:");
defaultRootObjectLabel = toolkit.createLabel(summaryComposite, "");
gdf.applyTo(defaultRootObjectLabel);
}
// Logging
Section loggingSection = toolkit.createSection(summaryComposite, Section.EXPANDED | Section.TITLE_BAR);
loggingSection.setText("Access Logging:");
Composite loggingComposite = toolkit.createComposite(loggingSection);
loggingSection.setClient(loggingComposite);
loggingComposite.setLayout(new GridLayout(2, false));
sectionGDF.applyTo(loggingSection);
toolkit.createLabel(loggingComposite, "Logging Enabled:");
loggingEnabledText = createText(loggingComposite);
toolkit.createLabel(loggingComposite, "Destination Bucket:");
loggingBucketText = createText(loggingComposite);
gdf.applyTo(loggingBucketText);
toolkit.createLabel(loggingComposite, "Log File Prefix:");
loggingPrefixText = createText(loggingComposite);
gdf.applyTo(loggingPrefixText);
WebLinkListener webLinkListener = new WebLinkListener();
createVerticalSpacer(loggingComposite);
createLink(loggingComposite, webLinkListener, "Amazon CloudFront provides optional log files with information about end user access to your objects.");
createLink(loggingComposite, webLinkListener, "For more information, see the <A HREF=\"" + ACCESS_LOGGING_DOCUMENTATION_URL + "\">Access Logs for Distributions</A> section in the Amazon CloudFront documentation.");
// CNAMEs
Section cnamesSection = toolkit.createSection(summaryComposite, Section.EXPANDED | Section.TITLE_BAR);
Composite cnamesComposite = toolkit.createComposite(cnamesSection);
cnamesSection.setClient(cnamesComposite);
sectionGDF.applyTo(cnamesSection);
cnamesSection.setText("CNAME Aliases:");
cnamesComposite.setLayout(new GridLayout(2, false));
cnamesList = new org.eclipse.swt.widgets.List(cnamesComposite, SWT.BORDER | SWT.READ_ONLY | SWT.V_SCROLL);
gdf.applyTo(cnamesList);
((GridData)cnamesList.getLayoutData()).horizontalSpan = 2;
createVerticalSpacer(cnamesComposite);
createLink(cnamesComposite, webLinkListener, "A CNAME record lets you specify an alternate domain name for the domain name CloudFront provides for your distribution.");
createLink(cnamesComposite, webLinkListener, "For more information, see the <A HREF=\"" + CNAME_DOCUMENTATION_URL + "\">Using CNAMEs with Distributions</A> section in the Amazon CloudFront documentation.");
}
/*
* Utils
*/
protected AmazonCloudFront getClient() {
AWSClientFactory clientFactory = AwsToolkitCore.getClientFactory(editorInput.getAccountId());
return clientFactory.getCloudFrontClientByEndpoint(editorInput.getRegionEndpoint());
}
protected Text createText(Composite parent) {
Text text = new Text(parent, SWT.READ_ONLY);
text.setBackground(parent.getBackground());
text.setText("");
return text;
}
protected Link createLink(Composite parent, Listener linkListener, String linkText) {
Link link = new Link(parent, SWT.WRAP);
link.setText(linkText);
link.addListener(SWT.Selection, linkListener);
GridData data = new GridData(SWT.FILL, SWT.TOP, false, false);
data.horizontalSpan = 2;
data.widthHint = 100;
data.heightHint = 15;
link.setLayoutData(data);
return link;
}
protected Composite createVerticalSpacer(Composite parent) {
Composite spacer = new Composite(parent, SWT.NONE);
GridData data = new GridData(SWT.FILL, SWT.TOP, false, false);
spacer.setSize(SWT.DEFAULT, 5);
data.horizontalSpan = 2;
data.widthHint = 5;
data.heightHint = 5;
spacer.setLayoutData(data);
return spacer;
}
protected void updateToolbar() {
form.getToolBarManager().update(true);
}
protected final class RefreshAction extends Action {
public RefreshAction() {
this.setText("Refresh");
this.setToolTipText("Refresh distribution information");
this.setImageDescriptor(AwsToolkitCore.getDefault().getImageRegistry().getDescriptor(AwsToolkitCore.IMAGE_REFRESH));
}
@Override
public void run() {
refreshData();
}
}
}