/*
* 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.logger.collector.ui.wizard;
import java.util.ArrayList;
import java.util.Calendar;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.preference.DirectoryFieldEditor;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FillLayout;
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.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import com.motorola.studio.android.logger.collector.ui.LogFileColumn;
import com.motorola.studio.android.logger.collector.util.LoggerCollectorConstants;
import com.motorola.studio.android.logger.collector.util.LoggerCollectorMessages;
import com.motorola.studio.android.logger.collector.util.WidgetsFactory;
import com.motorola.studio.android.logger.collector.util.WidgetsUtil;
/**
* This class contains the design of collect log files wizard page.
*/
public class LoggerCollectorWizardPage extends WizardPage
{
/**
* Directory field to output compacted file
*/
private DirectoryFieldEditor logDirecotryField = null;
private Text filenameText = null;
public static final String LOGGER_COLLECTOR_HELP_ID =
"com.motorola.studio.platform.logger.collector.collectlogs";
/**
* Composite used to show the Log File TableColumn.
*/
private LogFileColumn logFileColumn = null;
private Button selectAll = null;
private Button unselectAll = null;
/**
* Wizard composite
*/
private Composite composite;
/**
* Field to check if user has changed the wizard
*/
private boolean userChangedWizard = false;
/**
* The default constructor
*
* @param pageName The page name
*/
protected LoggerCollectorWizardPage(String pageName)
{
super(pageName);
setTitle(LoggerCollectorMessages.getInstance().getString(
"logger.collector.wizard.page.title")); //$NON-NLS-1$
setDescription(LoggerCollectorMessages.getInstance().getString(
"logger.collector.wizard.page.description")); //$NON-NLS-1$
}
/*
* (non-Javadoc)
* @see
* org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets
* .Composite)
*/
@Override
public void createControl(Composite parent)
{
composite = getComposite(parent);
composite.setLayout(new GridLayout(1, false));
composite.setLayoutData(new GridData(GridData.FILL_VERTICAL | SWT.TOP));
Composite compositeTop = WidgetsFactory.createComposite(composite, 3);
logDirecotryField =
new DirectoryFieldEditor("logFileNameField", //$NON-NLS-1$
LoggerCollectorMessages.getInstance().getString(
"logger.collector.wizard.page.directory") + ":", //$NON-NLS-1$ //$NON-NLS-2$
compositeTop);
logDirecotryField.getTextControl(compositeTop).addListener(SWT.Modify, listener);
logDirecotryField.getTextControl(compositeTop).setTextLimit(200);
Label filenameLabel = new Label(compositeTop, SWT.NONE);
filenameLabel.setText(LoggerCollectorMessages.getInstance().getString(
"logger.collector.wizard.page.file"));//$NON-NLS-1$
GridData layoutData = new GridData(SWT.LEFT, SWT.CENTER, false, false);
filenameLabel.setLayoutData(layoutData);
filenameText = new Text(compositeTop, SWT.BORDER);
layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1);
filenameText.setLayoutData(layoutData);
Composite compositeBottom = WidgetsFactory.createComposite(composite, 2);
Label l = new Label(compositeBottom, SWT.NONE);
l.setText(LoggerCollectorMessages.getInstance()
.getString("logger.collector.tableview.root"));//$NON-NLS-1$
GridData d = new GridData(SWT.LEFT, SWT.NONE, true, false, 2, 1);
l.setLayoutData(d);
logFileColumn = new LogFileColumn(compositeBottom, SWT.NONE);
logFileColumn.addTableListener(SWT.Selection, listener);
Composite buttons = new Composite(compositeBottom, SWT.NONE);
d = new GridData(SWT.NONE, SWT.TOP, false, true, 1, 1);
buttons.setLayoutData(d);
FillLayout layout = new FillLayout(SWT.VERTICAL);
layout.spacing = 2;
buttons.setLayout(layout);
selectAll = new Button(buttons, SWT.PUSH);
selectAll.setText(LoggerCollectorMessages.getInstance().getString(
"logger.collector.wizard.page.selectAll"));
selectAll.addSelectionListener(new ButtonSelectionListener(true));
selectAll.addListener(SWT.Selection, listener);
unselectAll = new Button(buttons, SWT.PUSH);
unselectAll.setText(LoggerCollectorMessages.getInstance().getString(
"logger.collector.wizard.page.unselectAll"));
unselectAll.addSelectionListener(new ButtonSelectionListener(false));
unselectAll.addListener(SWT.Selection, listener);
setControl(composite);
PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), LOGGER_COLLECTOR_HELP_ID);
logDirecotryField.setStringValue(System.getProperty("user.home"));
Calendar c = Calendar.getInstance();
filenameText.setText("studio_andr_" + c.get(Calendar.YEAR) + c.get(Calendar.MONTH)
+ c.get(Calendar.DAY_OF_MONTH) + c.get(Calendar.HOUR) + c.get(Calendar.MINUTE)
+ "." + LoggerCollectorConstants.ZIP_FILE_EXTENSION);
setErrorMessage(null);
}
/**
* Listener of collect log files finish button
*/
private final Listener listener = new Listener()
{
@Override
public void handleEvent(Event event)
{
userChangedWizard = true;
setPageComplete(isPageComplete());
setErrorMessage(getErrorMessage());
}
};
/**
* Return the composite used in the wizard.
*
* @param parent The parent content composite.
* @return The composite used in the wizard.
*/
protected Composite getComposite(Composite parent)
{
if (this.composite == null)
{
this.composite = WidgetsFactory.createComposite(parent);
}
return this.composite;
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
*/
@Override
public boolean isPageComplete()
{
return (getErrorMessage() == null) && !WidgetsUtil.isNullOrEmpty(this.logDirecotryField)
&& logFileColumn.hasNodeSelected();
}
/**
* Returns the error message, null if there is no error.
*
* @return an error message
*/
@Override
public String getErrorMessage()
{
String message = null;
String outputDir = Path.fromOSString(this.logDirecotryField.getStringValue()).toOSString();
ArrayList<String> notFoundLogs = null;
if (userChangedWizard)
{
if (WidgetsUtil.isNullOrEmpty(this.logDirecotryField))
{
message =
LoggerCollectorMessages.getInstance().getString(
"error.logger.collector.directory.empty"); //$NON-NLS-1$
}
else if (!WidgetsUtil.fileExist(outputDir))
{
message =
LoggerCollectorMessages.getInstance().getString(
"error.logger.collector.directory.not.found"); //$NON-NLS-1$
}
else if ((logFileColumn != null) && !logFileColumn.hasNodeSelected())
{
message =
LoggerCollectorMessages.getInstance().getString(
"error.logger.collector.log.not.selected"); //$NON-NLS-1$
}
else if ((logFileColumn != null)
&& ((notFoundLogs = logFileColumn.selectedLogFilesExist()).size() > 0))
{
StringBuilder messageBuilder =
new StringBuilder(LoggerCollectorMessages.getInstance().getString(
"error.logger.collector.log.not.found"));
messageBuilder.append(": ");
for (String log : notFoundLogs)
{
messageBuilder.append(log);
messageBuilder.append(",");
}
messageBuilder.deleteCharAt(messageBuilder.length() - 1);
message = messageBuilder.toString();
}
}
return message;
}
/**
* Gets the log file column (table view)
*
* @return log file column
*/
public LogFileColumn getLogFileColumn()
{
return this.logFileColumn;
}
/**
* Gets the file name text
*
* @return the file name text
*/
public String getFilename()
{
IPath fileName = new Path(filenameText.getText());
if ((fileName.getFileExtension() == null)
|| !fileName.getFileExtension().equalsIgnoreCase(
LoggerCollectorConstants.ZIP_FILE_EXTENSION))
{
fileName.addFileExtension(LoggerCollectorConstants.ZIP_FILE_EXTENSION);
}
return new Path(this.logDirecotryField.getStringValue()).append(fileName).toOSString();
}
final class ButtonSelectionListener implements SelectionListener
{
private final boolean selectionValue;
public ButtonSelectionListener(boolean selectionValue)
{
this.selectionValue = selectionValue;
}
@Override
public void widgetDefaultSelected(SelectionEvent e)
{
//do nothing
}
@Override
public void widgetSelected(SelectionEvent e)
{
logFileColumn.checkAll(selectionValue);
}
};
}