blob: e1854dff54027414a3d92a968a3a23de0bb9b8ba [file] [log] [blame]
/*********************************************************************************************
* Copyright (c) 2011, 2015 Wind River Systems, Inc. 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:
* William Chen (Wind River) - [345384]Provide property pages for remote file system nodes
* [361322]Minor improvements to the properties dialog of a file.
*********************************************************************************************/
package org.eclipse.tcf.te.tcf.filesystem.ui.internal.properties;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.util.Date;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.window.Window;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.tcf.te.tcf.filesystem.core.interfaces.runtime.IFSTreeNode;
import org.eclipse.tcf.te.tcf.filesystem.core.interfaces.runtime.IFSTreeNodeWorkingCopy;
import org.eclipse.tcf.te.tcf.filesystem.ui.internal.operations.UiExecutor;
import org.eclipse.tcf.te.tcf.filesystem.ui.nls.Messages;
import org.eclipse.ui.dialogs.PropertyPage;
/**
* The general information page of a file's properties dialog.
*/
public class GeneralInformationPage extends PropertyPage {
// The formatter for the size of a file.
private static final DecimalFormat SIZE_FORMAT = new DecimalFormat();
// The original node.
IFSTreeNode node;
// Cloned node for modification.
IFSTreeNodeWorkingCopy fWorkingCopy;
// The button of "Read-Only"
Button btnReadOnly;
// The button of "Hidden"
Button btnHidden;
// The button of "Permissions"
Button[] btnPermissions;
/**
* Create a horizontal separator between field sections.
*
* @param parent
* The parent composite of the separator.
*/
protected void createSeparator(Composite parent) {
Label label = new Label(parent, SWT.SEPARATOR | SWT.SHADOW_ETCHED_IN | SWT.HORIZONTAL);
GridData data = new GridData(SWT.FILL, SWT.BEGINNING, true, false);
data.horizontalSpan = 2;
label.setLayoutData(data);
}
/**
* Create a field displaying the a specific value with a specific label.
*
* @param text
* The label text for the field.
* @param value
* The value to be displayed.
* @param parent
* The parent composite of the field.
*/
protected void createField(String text, String value, Composite parent) {
Label label = new Label(parent, SWT.NONE);
label.setText(text);
GridData data = new GridData();
data.horizontalAlignment = SWT.LEFT;
data.verticalAlignment = SWT.TOP;
label.setLayoutData(data);
Text txt = new Text(parent, SWT.WRAP | SWT.READ_ONLY);
data = new GridData();
data.verticalAlignment = SWT.TOP;
data.widthHint = 300;
data.grabExcessHorizontalSpace = true;
data.horizontalAlignment = GridData.FILL;
txt.setLayoutData(data);
txt.setBackground(txt.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
txt.setText(value);
}
/**
* Get the string of the file size using using the formatter, SIZE_FORMAT.
*
* @param size
* The size of the file to be formatted.
* @return The string in the format of SIZE_FORMAT.
*/
protected String getSizeText(long size) {
return NLS.bind(Messages.GeneralInformationPage_FileSizeInfo, SIZE_FORMAT.format(size / 1024), SIZE_FORMAT.format(size));
}
/**
* Get the string of the specific time using the formatter, DATE_FORMAT.
*
* @param time
* The time to be formatted.
* @return The string in the format of DATE_FORMAT.
*/
protected String getDateText(long time) {
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT);
return dateFormat.format(new Date(time));
}
/**
* Create the attributes section for a Windows file/folder.
*
* @param parent
* The parent composite on which it is created.
*/
protected void createAttributesSection(Composite parent) {
// Attributes
Label label = new Label(parent, SWT.NONE);
label.setText(Messages.GeneralInformationPage_Attributes);
GridData data = new GridData();
data.horizontalAlignment = SWT.LEFT;
label.setLayoutData(data);
Composite attr = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(3, true);
layout.marginHeight = 0;
attr.setLayout(layout);
// Read-only
btnReadOnly = new Button(attr, SWT.CHECK);
btnReadOnly.setText(Messages.GeneralInformationPage_ReadOnly);
// Only the owner can edit this property
btnReadOnly.setEnabled(node.isAgentOwner());
btnReadOnly.addSelectionListener(new SelectionAdapter(){
@Override
public void widgetSelected(SelectionEvent e) {
if(btnReadOnly.getSelection()!=fWorkingCopy.isReadOnly()){
fWorkingCopy.setReadOnly(btnReadOnly.getSelection());
}
}
});
// Hidden
btnHidden = new Button(attr, SWT.CHECK);
btnHidden.setText(Messages.GeneralInformationPage_Hidden);
// Only the owner can edit this property
btnHidden.setEnabled(node.isAgentOwner());
btnHidden.addSelectionListener(new SelectionAdapter(){
@Override
public void widgetSelected(SelectionEvent e) {
Button btnHidden = (Button) e.getSource();
fWorkingCopy.setHidden(btnHidden.getSelection());
}
});
// Advanced Attributes
Button btnAdvanced = new Button(attr, SWT.PUSH);
btnAdvanced.setText(Messages.GeneralInformationPage_Advanced);
btnAdvanced.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
showAdvancedAttributes();
}
});
// Update the attribute values.
updateAttributes();
}
/**
* Update the value of attributes section.
*/
private void updateAttributes() {
btnReadOnly.setSelection(fWorkingCopy.isReadOnly());
btnHidden.setSelection(fWorkingCopy.isHidden());
}
/**
* Show the advanced attributes dialog for the specified file/folder.
*/
void showAdvancedAttributes() {
AdvancedAttributesDialog dialog = new AdvancedAttributesDialog(this.getShell(), fWorkingCopy.createWorkingCopy());
if (dialog.open() == Window.OK) {
IFSTreeNodeWorkingCopy result = dialog.getResult();
UiExecutor.execute(result.operationCommit());
}
}
/**
* Create the permissions section for a Unix/Linux file/folder.
*
* @param parent
* The parent composite on which it is created.
*/
protected void createPermissionsSection(Composite parent) {
GridLayout gridLayout;
Label label = new Label(parent, SWT.NONE);
label.setText(Messages.GeneralInformationPage_PermissionText);
GridData data = new GridData();
data.horizontalAlignment = SWT.LEFT;
data.verticalAlignment = SWT.TOP;
label.setLayoutData(data);
Composite perms = new Composite(parent, SWT.NONE);
gridLayout = new GridLayout(2, false);
gridLayout.marginHeight = 0;
perms.setLayout(gridLayout);
btnPermissions = new Button[9];
createPermissionGroup(perms, 0,
Messages.PermissionsGroup_UserPermissions);
createPermissionGroup(perms, 3,
Messages.PermissionsGroup_GroupPermissions);
createPermissionGroup(perms, 6,
Messages.PermissionsGroup_OtherPermissions);
// Update the permission values.
updatePermissions();
}
/**
* Create a permission group for a role, such as a user, a group or others.
*
* @param parent
* The parent composite.
* @param bit
* The permission bit index.
* @param header
* The group's header label.
*/
protected void createPermissionGroup(Composite parent, int bit, String header) {
Label label = new Label(parent, SWT.NONE);
label.setText(header);
GridData data = new GridData();
data.horizontalAlignment = SWT.LEFT;
label.setLayoutData(data);
Composite group = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(3, true);
layout.marginHeight = 0;
group.setLayout(layout);
createPermissionButton(Messages.PermissionsGroup_Readable, bit, group);
createPermissionButton(Messages.PermissionsGroup_Writable, bit + 1, group);
createPermissionButton(Messages.PermissionsGroup_Executable, bit + 2, group);
}
/**
* Create a check-box field for a single permission item.
*
* @param label
* The label of the permission.
* @param index
* The index of current permission bit mask index.
* @param parent
* The parent to hold the check-box field.
*/
private void createPermissionButton(String label, final int index, Composite parent) {
btnPermissions[index] = new Button(parent, SWT.CHECK);
btnPermissions[index].setText(label);
// Only the owner can edit its permission.
btnPermissions[index].setEnabled(node.isAgentOwner());
btnPermissions[index].addSelectionListener(new SelectionAdapter(){
@Override
public void widgetSelected(SelectionEvent e) {
int bit = 1 << (8 - index);
fWorkingCopy.setPermission(bit, btnPermissions[index].getSelection());
}
});
}
/**
* Update the value of permissions section.
*/
private void updatePermissions(){
for (int i = 0; i < 9; i++) {
final int bit = 1 << (8 - i);
btnPermissions[i].setSelection(fWorkingCopy.getPermission(bit));
}
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.preference.PreferencePage#performDefaults()
*/
@Override
protected void performDefaults() {
fWorkingCopy = node.createWorkingCopy();
if (node.isWindowsNode()) {
updateAttributes();
} else {
updatePermissions();
}
super.performDefaults();
}
@Override
public boolean performOk() {
if (hasAttrsChanged()) {
UiExecutor.execute(fWorkingCopy.operationCommit());
}
return getErrorMessage() == null;
}
/**
* If the attributes has been changed.
* @return If the attributes has been changed.
*/
private boolean hasAttrsChanged() {
return fWorkingCopy.isDirty();
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createContents(Composite parent) {
IAdaptable element = getElement();
Assert.isTrue(element instanceof IFSTreeNode);
node = (IFSTreeNode) element;
fWorkingCopy = node.createWorkingCopy();
Composite page = new Composite(parent, SWT.NONE);
GridLayout gridLayout = new GridLayout(2, false);
page.setLayout(gridLayout);
// Field "Name"
createField(Messages.GeneralInformationPage_Name, fWorkingCopy.getName(), page);
// Field "Type"
String fileType = fWorkingCopy.getFileTypeLabel();
createField(Messages.GeneralInformationPage_Type, fileType, page);
// Field "Location"
String location = fWorkingCopy.isFileSystem() || fWorkingCopy.isRootDirectory() ?
Messages.GeneralInformationPage_Computer : fWorkingCopy.getLocation();
createField(Messages.GeneralInformationPage_Location, location, page);
// Field "Size"
if (fWorkingCopy.isFile()) {
long size = fWorkingCopy.getSize();
createField(Messages.GeneralInformationPage_Size, size > 0 ? getSizeText(size) : "", page); //$NON-NLS-1$
}
// Field "Modified"
long lm = fWorkingCopy.getModificationTime();
createField(Messages.GeneralInformationPage_Modified, lm != 0 ? getDateText(lm) : "", page); //$NON-NLS-1$
// Field "Accessed"
if (fWorkingCopy.isFile()) {
long at = fWorkingCopy.getAccessTime();
createField(Messages.GeneralInformationPage_Accessed, at != 0 ? getDateText(at) : "", page); //$NON-NLS-1$
}
createSeparator(page);
if (fWorkingCopy.isWindowsNode()) {
createAttributesSection(page);
} else {
createPermissionsSection(page);
}
return page;
}
}