/* | |
* Copyright (C) 2012 The Android Open Source Project | |
* | |
* 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://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License 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.motorola.studio.android.devices; | |
import java.io.BufferedWriter; | |
import java.io.File; | |
import java.io.FileNotFoundException; | |
import java.io.FileWriter; | |
import java.io.IOException; | |
import java.text.Collator; | |
import java.util.Iterator; | |
import java.util.Locale; | |
import java.util.Map; | |
import java.util.Properties; | |
import org.eclipse.core.resources.ResourcesPlugin; | |
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.FileDialog; | |
import org.eclipse.swt.widgets.Table; | |
import org.eclipse.swt.widgets.TableColumn; | |
import org.eclipse.swt.widgets.TableItem; | |
import org.eclipse.ui.IWorkbenchPropertyPage; | |
import org.eclipse.ui.dialogs.PropertyPage; | |
import com.motorola.studio.android.common.log.StudioLogger; | |
import com.motorola.studio.android.common.utilities.EclipseUtils; | |
import com.motorola.studio.android.i18n.AndroidNLS; | |
public abstract class AbstractDevicePropertyPage extends PropertyPage implements | |
IWorkbenchPropertyPage | |
{ | |
private Properties propValues; | |
/* | |
* (non-Javadoc) | |
* | |
* @see | |
* org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse | |
* .swt.widgets.Composite) | |
*/ | |
@SuppressWarnings("unchecked") | |
@Override | |
protected Control createContents(Composite parent) | |
{ | |
final Composite parentComposite = new Composite(parent, SWT.NONE); | |
parentComposite.setLayout(new GridLayout(2, false)); | |
parentComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); | |
final Table propTable = new Table(parentComposite, SWT.FILL | SWT.FULL_SELECTION); | |
final GridData data = new GridData(); | |
data.horizontalSpan = 2; | |
data.heightHint = 150; | |
data.grabExcessVerticalSpace = true; | |
data.grabExcessHorizontalSpace = true; | |
data.horizontalAlignment = SWT.FILL; | |
data.verticalAlignment = SWT.FILL; | |
propTable.setLayoutData(data); | |
propTable.setLinesVisible(true); | |
final TableColumn keyColumn = new TableColumn(propTable, SWT.LEFT); | |
keyColumn.setText(AndroidNLS.AbstractDevicePropertyPage_Property); | |
keyColumn.setWidth(200); | |
TableColumn valueColumn = new TableColumn(propTable, SWT.LEFT); | |
valueColumn.setText(AndroidNLS.AbstractDevicePropertyPage_Value); | |
valueColumn.setWidth(200); | |
propTable.setHeaderVisible(true); | |
propValues = getDeviceProperties(); | |
if ((propValues != null) && !propValues.isEmpty()) | |
{ | |
for (Map.Entry entry : propValues.entrySet()) | |
{ | |
TableItem item = new TableItem(propTable, SWT.NONE); | |
item.setText(new String[] | |
{ | |
(String) entry.getKey(), (String) entry.getValue() | |
}); | |
} | |
} | |
Button button = new Button(parentComposite, SWT.PUSH); | |
final GridData buttonData = new GridData(); | |
buttonData.horizontalSpan = 1; | |
buttonData.grabExcessVerticalSpace = false; | |
buttonData.grabExcessHorizontalSpace = true; | |
buttonData.horizontalAlignment = SWT.END; | |
buttonData.verticalAlignment = SWT.CENTER; | |
button.setLayoutData(buttonData); | |
button.setText(AndroidNLS.AbstractDevicePropertyPage_CVS_Export); | |
button.pack(); | |
if (propValues.isEmpty()) | |
{ | |
button.setEnabled(false); | |
} | |
button.addSelectionListener(new SelectionAdapter() | |
{ | |
@Override | |
public void widgetSelected(SelectionEvent e) | |
{ | |
FileDialog selectionDialog = new FileDialog(getShell(), SWT.SAVE | SWT.SHEET); | |
selectionDialog.setFilterExtensions(new String[] | |
{ | |
"*.csv" //$NON-NLS-1$ | |
}); | |
selectionDialog.setFilterPath(ResourcesPlugin.getWorkspace().getRoot() | |
.getLocation().toOSString()); | |
String csvPath = selectionDialog.open(); | |
File csvFile = new File(csvPath); | |
String fileName = csvFile.getName(); | |
if ((csvFile != null) && !"".equals(fileName)) //$NON-NLS-1$ | |
{ | |
int extensionIdx = fileName.lastIndexOf("."); //$NON-NLS-1$ | |
if ((extensionIdx < 0) || "".equals(fileName.substring(extensionIdx))) //$NON-NLS-1$ | |
{ | |
csvFile = new File(csvFile.getAbsolutePath() + ".csv"); //$NON-NLS-1$ | |
} | |
BufferedWriter outputWriter = null; | |
try | |
{ | |
outputWriter = new BufferedWriter(new FileWriter(csvFile)); | |
Iterator keyIt = propValues.keySet().iterator(); | |
while (keyIt.hasNext()) | |
{ | |
String key = (String) keyIt.next(); | |
String value = (String) propValues.get(key); | |
outputWriter.append(key); | |
outputWriter.append(","); //$NON-NLS-1$ | |
if (value.contains(",")) //$NON-NLS-1$ | |
{ | |
outputWriter.append("\""); //$NON-NLS-1$ | |
outputWriter.append(value); | |
outputWriter.append("\""); //$NON-NLS-1$ | |
} | |
else | |
{ | |
outputWriter.append(value); | |
} | |
outputWriter.newLine(); | |
} | |
} | |
catch (FileNotFoundException fnf) | |
{ | |
EclipseUtils.showErrorDialog( | |
AndroidNLS.AbstractDevicePropertyPage_Error_Title, | |
AndroidNLS.AbstractDevicePropertyPage_Error_Message); | |
} | |
catch (IOException ioex) | |
{ | |
EclipseUtils.showErrorDialog( | |
AndroidNLS.AbstractDevicePropertyPage_Error_Title, | |
AndroidNLS.AbstractDevicePropertyPage_Error_Message); | |
} | |
finally | |
{ | |
if (outputWriter != null) | |
{ | |
try | |
{ | |
outputWriter.flush(); | |
outputWriter.close(); | |
} | |
catch (IOException e1) | |
{ | |
StudioLogger.error("Could not close stream. " + e1.getMessage()); | |
} | |
} | |
} | |
} | |
else | |
{ | |
EclipseUtils.showErrorDialog(AndroidNLS.AbstractDevicePropertyPage_Error_Title, | |
AndroidNLS.AbstractDevicePropertyPage_Error_Message_Valid_File); | |
} | |
} | |
}); | |
propTable.pack(); | |
parentComposite.pack(); | |
SelectionAdapter sortListener = new SelectionAdapter() | |
{ | |
@Override | |
public void widgetSelected(SelectionEvent e) | |
{ | |
TableColumn sortColumn = propTable.getSortColumn(); | |
TableColumn currentColumn = (TableColumn) e.widget; | |
int columnIndex = (currentColumn == keyColumn ? 0 : 1); | |
int dir = propTable.getSortDirection(); | |
if (sortColumn == currentColumn) | |
{ | |
if (dir == SWT.UP) | |
{ | |
dir = SWT.DOWN; | |
} | |
else | |
{ | |
dir = SWT.UP; | |
} | |
} | |
else | |
{ | |
dir = SWT.UP; | |
} | |
sortTable(propTable, columnIndex, sortColumn, currentColumn, dir); | |
} | |
}; | |
keyColumn.addSelectionListener(sortListener); | |
valueColumn.addSelectionListener(sortListener); | |
propTable.setSortColumn(keyColumn); | |
propTable.setSortDirection(SWT.UP); | |
sortTable(propTable, 0, keyColumn, keyColumn, SWT.UP); | |
noDefaultAndApplyButton(); | |
return parentComposite; | |
} | |
abstract protected Properties getDeviceProperties(); | |
private void sortTable(Table table, int columnIndex, TableColumn sortColumn, | |
TableColumn currentColumn, int dir) | |
{ | |
table.setSortDirection(dir); | |
TableItem[] items = table.getItems(); | |
Collator collator = Collator.getInstance(Locale.getDefault()); | |
int index = columnIndex; | |
for (int i = 1; i < items.length; i++) | |
{ | |
String value1 = items[i].getText(index); | |
for (int j = 0; j < i; j++) | |
{ | |
String value2 = items[j].getText(index); | |
if (dir == SWT.UP) | |
{ | |
if (collator.compare(value1, value2) < 0) | |
{ | |
String[] values = | |
{ | |
items[i].getText(0), items[i].getText(1) | |
}; | |
items[i].dispose(); | |
TableItem item = new TableItem(table, SWT.NONE, j); | |
item.setText(values); | |
items = table.getItems(); | |
break; | |
} | |
} | |
else | |
{ | |
if (collator.compare(value1, value2) > 0) | |
{ | |
String[] values = | |
{ | |
items[i].getText(0), items[i].getText(1) | |
}; | |
items[i].dispose(); | |
TableItem item = new TableItem(table, SWT.NONE, j); | |
item.setText(values); | |
items = table.getItems(); | |
break; | |
} | |
} | |
} | |
} | |
table.setSortColumn(currentColumn); | |
} | |
} |