blob: 1aed097bec7cae8abdc12267aaaa08fe2639033f [file] [log] [blame]
/*
* 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);
}
}