project/com.nokia.carbide.cpp.project.ui/src/com/nokia/carbide/cpp/internal/project/ui/editors/inf/MMPFileDialog.java
/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/
package com.nokia.carbide.cpp.internal.project.ui.editors.inf;
import com.nokia.carbide.cdt.builder.EpocEnginePathHelper;
import com.nokia.carbide.cpp.epoc.engine.model.bldinf.IMMPReference;
import com.nokia.carbide.cpp.epoc.engine.model.bldinf.IMakMakeReference;
import com.nokia.carbide.cpp.internal.project.ui.editors.common.StatusInfo;
import com.nokia.cpp.internal.api.utils.ui.BrowseDialogUtils;
import com.nokia.cpp.internal.api.utils.ui.WorkbenchUtils;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.StatusDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import java.io.File;
public class MMPFileDialog extends StatusDialog implements IMakMakeFileDialog {
private IMMPReference mmpFileReference;
private final BldInfEditorContext editorContext;
private boolean isTest;
private Text filePath;
private Button browseButton;
private Button tidyButton;
private Button buildAsArmButton;
private Button manualButton;
private Button supportButton;
private EpocEnginePathHelper pathHelper;
private boolean isEdit;
public MMPFileDialog(Shell parentShell, IMMPReference mmpFileReference, BldInfEditorContext editorContext, boolean isTest) {
super(parentShell);
this.mmpFileReference = editorContext.bldInfView.createMMPReference();
if (mmpFileReference != null) {
// copy values from reference being edited
this.mmpFileReference.setPath(mmpFileReference.getPath());
this.mmpFileReference.setBuildAsArm(mmpFileReference.isBuildAsArm());
this.mmpFileReference.setManual(mmpFileReference.isManual());
this.mmpFileReference.setSupport(mmpFileReference.isSupport());
this.mmpFileReference.setTidy(mmpFileReference.isTidy());
}
this.editorContext = editorContext;
this.isTest = isTest;
pathHelper = new EpocEnginePathHelper(editorContext.project);
isEdit = (mmpFileReference != null);
setShellStyle(getShellStyle() | SWT.RESIZE);
setHelpAvailable(true);
}
@Override
protected void okPressed() {
// get the project relative path of the new file to pass to pathHelper.convertPathToView
IPath projectLocation = editorContext.project.getLocation();
IPath newFilePath = new Path(filePath.getText());
int segments = projectLocation.matchingFirstSegments(newFilePath);
IPath prefix = projectLocation.removeFirstSegments(segments);
IPath suffix = newFilePath.removeFirstSegments(segments);
IPath relativePath = new Path(""); //$NON-NLS-1$
for (int i = 0; i < prefix.segmentCount(); ++i) {
relativePath = relativePath.append(".." + IPath.SEPARATOR); //$NON-NLS-1$
}
relativePath = relativePath.append(suffix);
mmpFileReference.setPath(pathHelper.convertPathToView(relativePath));
mmpFileReference.setTidy(tidyButton.getSelection());
if (buildAsArmButton != null) {
mmpFileReference.setBuildAsArm(buildAsArmButton.getSelection());
}
if (manualButton != null) {
mmpFileReference.setManual(manualButton.getSelection());
}
if (supportButton != null) {
mmpFileReference.setSupport(supportButton.getSelection());
}
super.okPressed();
}
/**
* Create contents of the dialog
* @param parent
*/
@Override
protected Control createDialogArea(Composite parent) {
Composite container = (Composite) super.createDialogArea(parent);
GridLayout layout = new GridLayout();
layout.numColumns = 3;
layout.marginTop = 0;
layout.marginBottom = 0;
layout.marginWidth = 10;
container.setLayout(layout);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.horizontalSpan = 1;
container.setLayoutData(data);
final Label filePathLabel = new Label(container, SWT.NONE);
filePathLabel.setText(Messages.MMPFileDialog_FilePath);
data = new GridData();
data.horizontalSpan = 1;
filePathLabel.setLayoutData(data);
filePathLabel.setToolTipText(Messages.MMPFileDialog_FilePathToolTip);
filePath = new Text(container, SWT.BORDER);
data = new GridData(GridData.FILL_HORIZONTAL);
filePath.setLayoutData(data);
filePath.setToolTipText(Messages.MMPFileDialog_FilePathToolTip);
filePath.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
checkValues();
}
});
browseButton = new Button(container, SWT.PUSH);
browseButton.setText(Messages.MMPFileDialog_Browse);
browseButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent evt) {
FileDialog dialog = new FileDialog(getShell(), SWT.NONE);
dialog.setText(Messages.MMPFileDialog_FileDialogTitle);
dialog.setFilterExtensions(new String[] {"*.mmp", "*"}); //$NON-NLS-1$, //$NON-NLS-2$
dialog.setFilterNames(new String[] {Messages.MMPFileDialog_MMPFiles, Messages.MMPFileDialog_AllFiles});
// set the initial directory
BrowseDialogUtils.initializeFrom(dialog, filePath, editorContext.project.getLocation());
String result = dialog.open();
if (result != null) {
filePath.setText(result);
}
}
});
tidyButton = new Button(container, SWT.CHECK | SWT.LEFT);
tidyButton.setText(Messages.MMPFileDialog_Tidy);
tidyButton.setToolTipText(Messages.MMPFileDialog_TidyToolTip);
data = new GridData();
data.horizontalSpan = 3;
tidyButton.setLayoutData(data);
if (isTest) {
manualButton = new Button(container, SWT.CHECK | SWT.LEFT);
manualButton.setText(Messages.MMPFileDialog_Manual);
manualButton.setToolTipText(Messages.MMPFileDialog_ManualToolTip);
data = new GridData();
data.horizontalSpan = 3;
manualButton.setLayoutData(data);
supportButton = new Button(container, SWT.CHECK | SWT.LEFT);
supportButton.setText(Messages.MMPFileDialog_Support);
supportButton.setToolTipText(Messages.MMPFileDialog_SupportToolTip);
data = new GridData();
data.horizontalSpan = 3;
supportButton.setLayoutData(data);
} else {
buildAsArmButton = new Button(container, SWT.CHECK | SWT.LEFT);
buildAsArmButton.setText(Messages.MMPFileDialog_BuildAsArm);
buildAsArmButton.setToolTipText(Messages.MMPFileDialog_BuildAsArmToolTip);
data = new GridData();
data.horizontalSpan = 3;
buildAsArmButton.setLayoutData(data);
}
// initialize values
IPath fp = mmpFileReference.getPath();
if (fp != null) {
IPath fsPath = pathHelper.convertToFilesystem(fp);
if (fsPath != null) {
filePath.setText(fsPath.toOSString());
}
}
tidyButton.setSelection(mmpFileReference.isTidy());
if (isTest) {
manualButton.setSelection(mmpFileReference.isManual());
supportButton.setSelection(mmpFileReference.isSupport());
} else {
buildAsArmButton.setSelection(mmpFileReference.isBuildAsArm());
}
return container;
}
public void create() {
super.create();
checkValues();
}
public IMakMakeReference getMakeMakeFile() {
return mmpFileReference;
}
/**
* Return the initial size of the dialog
*/
@Override
protected Point getInitialSize() {
return new Point(600, isTest ? 200 : 180);
}
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText(isEdit ? Messages.MMPFileDialog_EditMMPEntry : Messages.MMPFileDialog_AddMMPEntry);
WorkbenchUtils.setHelpContextId(newShell, HelpContexts.MMP_DIALOG);
}
protected void checkValues() {
StatusInfo status = new StatusInfo();
status.setOK();
String sp = filePath.getText().trim();
if (sp.length() > 0) {
if (!new File(sp).exists()) {
status.setError(Messages.MMPFileDialog_MMPFileDoesNotExistError);
} else if (!editorContext.project.getLocation().isPrefixOf(new Path(sp))) {
// make sure it's under the project root. we can't support adding of files outside of the project since all
// of the engine and path helpers is project-relative.
status.setError(Messages.MMPFileDialog_MMPFileOutsideOfProject);
}
}
else {
status.setError(Messages.MMPFileDialog_MMPFileNotSpecifiedError);
}
updateStatus(status);
}
public int show() {
return open();
}
public Text getFilePathText() {
return filePath;
}
public Button getBrowseButton() {
return browseButton;
}
public Button getTidyButton() {
return tidyButton;
}
public Button getBuildAsARMButton() {
return buildAsArmButton;
}
public Button getManualButton() {
return manualButton;
}
public Button getSupportButton() {
return supportButton;
}
}