blob: 4fb02c7903f3413adc082c706c8174cbf814c5c5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2013 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 API and implementation
* Peter Friese <peter.friese@gentleware.com> - bug 201956
* Lars Vogel <Lars.Vogel@gmail.com> - Bug 424113
*******************************************************************************/
package org.eclipse.pde.internal.ui.editor.product;
import org.eclipse.core.resources.IFile;
import org.eclipse.jface.window.Window;
import org.eclipse.pde.core.IModelChangedEvent;
import org.eclipse.pde.internal.core.iproduct.*;
import org.eclipse.pde.internal.ui.PDEPlugin;
import org.eclipse.pde.internal.ui.PDEUIMessages;
import org.eclipse.pde.internal.ui.editor.*;
import org.eclipse.pde.internal.ui.editor.validation.TextValidator;
import org.eclipse.pde.internal.ui.parts.FormEntry;
import org.eclipse.pde.internal.ui.util.FileExtensionsFilter;
import org.eclipse.pde.internal.ui.util.FileValidator;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
public class WindowImagesSection extends PDESection {
private TextValidator[] fWinImageEntryValidator;
private static final int[][] F_ICON_DIMENSIONS = new int[][] { {16, 16}, {32, 32}, {48, 48}, {64, 64}, {128, 128}, {256, 256}};
private static final String[] F_ICON_LABELS = new String[] {PDEUIMessages.WindowImagesSection_16, PDEUIMessages.WindowImagesSection_32, PDEUIMessages.WindowImagesSection_48, PDEUIMessages.WindowImagesSection_64, PDEUIMessages.WindowImagesSection_128, PDEUIMessages.WindowImagesSection_256};
private FormEntry[] fImages = new FormEntry[F_ICON_LABELS.length];
public WindowImagesSection(PDEFormPage page, Composite parent) {
super(page, parent, Section.DESCRIPTION);
createClient(getSection(), page.getEditor().getToolkit());
}
@Override
protected void createClient(Section section, FormToolkit toolkit) {
section.setLayout(FormLayoutFactory.createClearGridLayout(false, 1));
GridData data = new GridData(GridData.FILL_HORIZONTAL);
section.setLayoutData(data);
section.setText(PDEUIMessages.WindowImagesSection_title);
section.setDescription(PDEUIMessages.WindowImagesSection_desc);
Composite client = toolkit.createComposite(section);
client.setLayout(FormLayoutFactory.createSectionClientGridLayout(false, 3));
client.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
IActionBars actionBars = getPage().getPDEEditor().getEditorSite().getActionBars();
// Store all image entry validators
fWinImageEntryValidator = new TextValidator[F_ICON_LABELS.length];
for (int i = 0; i < fImages.length; i++) {
final int index = i;
fImages[index] = new FormEntry(client, toolkit, F_ICON_LABELS[index], PDEUIMessages.WindowImagesSection_browse, isEditable());
fImages[index].setEditable(isEditable());
// Create validator
fWinImageEntryValidator[index] = new TextValidator(getManagedForm(), fImages[index].getText(), getProject(), true) {
@Override
protected boolean validateControl() {
return validateWinImageEntry(index);
}
};
fImages[index].setFormEntryListener(new FormEntryAdapter(this, actionBars) {
@Override
public void textValueChanged(FormEntry entry) {
getWindowImages().setImagePath(entry.getValue(), index);
}
@Override
public void browseButtonSelected(FormEntry entry) {
handleBrowse(entry);
}
@Override
public void linkActivated(HyperlinkEvent e) {
EditorUtilities.openImage(fImages[index].getValue(), getProduct().getDefiningPluginId());
}
});
}
toolkit.paintBordersFor(client);
section.setClient(client);
// Register to be notified when the model changes
getModel().addModelChangedListener(this);
}
@Override
public void refresh() {
IWindowImages images = getWindowImages();
// Turn off auto message update until after values are set
fWinImageEntryValidator[0].setRefresh(false);
for (int i = 0; i < F_ICON_LABELS.length; i++) {
fImages[i].setValue(images.getImagePath(i), true);
}
// Turn back on auto message update
fWinImageEntryValidator[0].setRefresh(true);
super.refresh();
}
private boolean validateWinImageEntry(int index) {
return EditorUtilities.imageEntryHasExactSize(fWinImageEntryValidator[index], fImages[index], getProduct(), F_ICON_DIMENSIONS[index][0], F_ICON_DIMENSIONS[index][1]);
}
private IWindowImages getWindowImages() {
IWindowImages images = getProduct().getWindowImages();
if (images == null) {
images = getModel().getFactory().createWindowImages();
getProduct().setWindowImages(images);
}
return images;
}
private IProduct getProduct() {
return getModel().getProduct();
}
private IProductModel getModel() {
return (IProductModel) getPage().getPDEEditor().getAggregateModel();
}
@Override
public void commit(boolean onSave) {
for (int i = 0; i < F_ICON_LABELS.length; i++) {
fImages[i].commit();
}
super.commit(onSave);
}
@Override
public void cancelEdit() {
for (int i = 0; i < F_ICON_LABELS.length; i++) {
fImages[i].cancelEdit();
}
super.cancelEdit();
}
private void handleBrowse(FormEntry entry) {
ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getSection().getShell(), new WorkbenchLabelProvider(), new WorkbenchContentProvider());
dialog.setValidator(new FileValidator());
dialog.setAllowMultiple(false);
dialog.setTitle(PDEUIMessages.WindowImagesSection_dialogTitle);
dialog.setMessage(PDEUIMessages.WindowImagesSection_dialogMessage);
FileExtensionsFilter filter = new FileExtensionsFilter();
filter.addFileExtension("gif"); //$NON-NLS-1$
filter.addFileExtension("png"); //$NON-NLS-1$
dialog.addFilter(filter);
dialog.setInput(PDEPlugin.getWorkspace().getRoot());
if (dialog.open() == Window.OK) {
IFile file = (IFile) dialog.getFirstResult();
entry.setValue(file.getFullPath().toString());
}
}
@Override
public boolean canPaste(Clipboard clipboard) {
Display d = getSection().getDisplay();
Control c = d.getFocusControl();
if (c instanceof Text)
return true;
return false;
}
@Override
public void modelChanged(IModelChangedEvent e) {
// No need to call super, handling world changed event here
if (e.getChangeType() == IModelChangedEvent.WORLD_CHANGED) {
handleModelEventWorldChanged(e);
}
}
/**
* @param event
*/
private void handleModelEventWorldChanged(IModelChangedEvent event) {
refresh();
}
@Override
public void dispose() {
IProductModel model = getModel();
if (model != null) {
model.removeModelChangedListener(this);
}
super.dispose();
}
}