/*
* 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.generateviewbylayout.ui;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TableItem;
import com.motorola.studio.android.codeutils.CodeUtilsActivator;
import com.motorola.studio.android.codeutils.i18n.CodeUtilsNLS;
import com.motorola.studio.android.generateviewbylayout.codegenerators.SaveStateCodeGenerator;
import com.motorola.studio.android.generateviewbylayout.model.LayoutNode;
/**
* GUI to enable selection of which Android items
* will be inserted into activity or fragment
*/
public class ChooseLayoutItemsDialog extends AbstractLayoutItemsDialog
{
private final String DIALOG_HELP = CodeUtilsActivator.PLUGIN_ID
+ ".generate-code-from-layout-dialog"; //$NON-NLS-1$
private Button generateListeners;
private boolean hasGuiItemsWithoutId = false;
private final Map<TableItem, TableEditor> itemToEditorMap;
private static final String WIZARD_IMAGE_PATH = "icons/wizban/fill_activity_ban.png"; //$NON-NLS-1$
public ChooseLayoutItemsDialog(Shell parentShell)
{
super(parentShell, CodeUtilsNLS.ChooseLayoutItemsDialog_DefaultMessage,
CodeUtilsNLS.UI_ChooseLayoutItemsDialog_Dialog_Title,
CodeUtilsNLS.ChooseLayoutItemsDialog_FillActivityBasedOnLayout, CodeUtilsActivator
.getImageDescriptor(WIZARD_IMAGE_PATH).createImage());
setHelpID(DIALOG_HELP);
itemToEditorMap = new HashMap<TableItem, TableEditor>();
}
@Override
protected void createCustomContentArea(Composite parent)
{
Label separator = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL);
separator.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM, true, false, 2, 1));
createCheckboxArea(parent);
}
@Override
protected void createColumns(TableViewer viewer)
{
super.createColumns(viewer);
TableViewerColumn column =
createTableViewerColumn(viewer, CodeUtilsNLS.ChooseLayoutItemsDialog_SaveState, 80,
3);
column.setLabelProvider(new ColumnLabelProvider()
{
@Override
public String getText(Object element)
{
return null;
}
});
column.getColumn().setToolTipText(CodeUtilsNLS.ChooseLayoutItemsDialog_SaveStateTooltip);
}
@Override
protected void populateViewer()
{
super.populateViewer();
populateSaveStateColumn();
}
private void populateSaveStateColumn()
{
if (getViewer() != null)
{
itemToEditorMap.clear();
for (final TableItem item : getViewer().getTable().getItems())
{
LayoutNode node = (LayoutNode) item.getData();
if (SaveStateCodeGenerator.canGenerateSaveStateCode(node))
{
final TableEditor editor = new TableEditor(getViewer().getTable());
editor.setColumn(3);
editor.horizontalAlignment = SWT.CENTER;
editor.grabHorizontal = false;
editor.minimumWidth =
getViewer().getTable().getColumn(3).getWidth() < 20 ? getViewer()
.getTable().getColumn(3).getWidth() : 20;
getViewer().getTable().getColumn(3).addControlListener(new ControlAdapter()
{
@Override
public void controlResized(ControlEvent e)
{
editor.minimumWidth =
getViewer().getTable().getColumn(3).getWidth() < 20
? getViewer().getTable().getColumn(3).getWidth() : 20;
}
});
final Button checkbox = new Button(getViewer().getTable(), SWT.CHECK);
checkbox.setEnabled(false);
checkbox.pack();
final SelectionListener listener = new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
if ((e.detail & SWT.CHECK) != 0)
{
if ((e.item instanceof TableItem) && (editor.getItem() == e.item))
{
checkbox.setEnabled(((TableItem) e.item).getChecked());
}
}
}
};
checkbox.setSelection(node.getSaveState());
getViewer().getTable().addSelectionListener(listener);
checkbox.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
LayoutNode node = (LayoutNode) editor.getItem().getData();
node.setSaveState(checkbox.getSelection());
}
});
editor.setEditor(checkbox, item, 3);
item.addDisposeListener(new DisposeListener()
{
public void widgetDisposed(DisposeEvent e)
{
getViewer().getTable().removeSelectionListener(listener);
editor.getEditor().dispose();
editor.dispose();
}
});
itemToEditorMap.put(item, editor);
}
}
}
}
@Override
protected void itemCheckStateChanged(TableItem item)
{
super.itemCheckStateChanged(item);
if (itemToEditorMap.get(item) != null)
{
((Button) itemToEditorMap.get(item).getEditor()).setEnabled(item.getChecked());
}
}
@Override
protected List<LayoutNode> getGuiItemsList()
{
List<LayoutNode> completeGuiItemsList = getCodeGeneratorData().getGUIItemsForUI();
List<LayoutNode> processedGuiItemsList = new ArrayList<LayoutNode>();
hasGuiItemsWithoutId = false;
for (LayoutNode guiItem : completeGuiItemsList)
{
if ((guiItem.getNodeId() != null) && (guiItem.getNodeId().length() > 0))
{
processedGuiItemsList.add(guiItem);
}
else
{
hasGuiItemsWithoutId = true;
}
}
return processedGuiItemsList;
}
/* (non-Javadoc)
* @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
*/
@Override
protected void configureShell(Shell newShell)
{
newShell.setSize(640, 480);
super.configureShell(newShell);
}
/**
* Creates GUI items for choosing whether code for listeners should be auto-generated.
* @param optionsComposite
*/
private void createCheckboxArea(Composite parent)
{
generateListeners = new Button(parent, SWT.CHECK);
generateListeners.setText(CodeUtilsNLS.ChooseLayoutItemsDialog_GenerateDefaultListeners);
generateListeners.setSelection(true);
generateListeners.setLayoutData(new GridData(SWT.LEFT, SWT.BOTTOM, false, false, 2, 1));
}
/**
* Handles the enablement of the Ok button.
* It will only be enabled when at least one table item is checked.
*/
@Override
protected void validate()
{
super.validate();
if ((getViewer() != null) && (getErrorMessage() == null))
{
// set the appropriate message
String message = ""; //$NON-NLS-1$
int messageType = IMessageProvider.NONE;
//check if at least one table item was selected
for (TableItem item : getViewer().getTable().getItems())
{
LayoutNode node = (LayoutNode) item.getData();
if (item.getChecked()
&& (getCodeGeneratorData() != null)
&& getCodeGeneratorData().getJavaLayoutData().getVisitor()
.checkIfAttributeAlreadyDeclared(node, true))
{
message =
NLS.bind(CodeUtilsNLS.ChooseLayoutItemsDialog_VariableNameInUse_Error,
node.getNodeId());
messageType = IMessageProvider.ERROR;
break;
}
}
if (messageType == IMessageProvider.NONE)
{
if (getViewer().getTable().getItemCount() == 0)
{
message = CodeUtilsNLS.UI_ChooseLayoutItemsDialog_No_Gui_Items_Available;
messageType = IMessageProvider.INFORMATION;
}
else if (hasGuiItemsWithoutId)
{
message = CodeUtilsNLS.ChooseLayoutItemsDialog_Gui_Items_Available_No_Id;
messageType = IMessageProvider.INFORMATION;
}
else
{
message = CodeUtilsNLS.ChooseLayoutItemsDialog_DefaultMessage;
}
}
this.setMessage(message, messageType);
}
}
/**
* Each table item refers to a LayoutNode object.
* When user press Ok, the insertCode status of these objects are set accordingly to table selections.
*/
@Override
protected void okPressed()
{
//set the insertCode for each layoutNode accordingly
for (TableItem item : getViewer().getTable().getItems())
{
if (item.getData() instanceof LayoutNode)
{
LayoutNode node = (LayoutNode) item.getData();
node.setInsertCode(item.getChecked());
}
}
getModifier().setGenerateDefaultListeners(generateListeners.getSelection());
getModifier().setCodeGeneratorData(getCodeGeneratorData());
super.okPressed();
}
/**
* Passing the focus request to the viewer's control.
*/
public void setFocus()
{
getViewer().getControl().setFocus();
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#isResizable()
*/
@Override
protected boolean isResizable()
{
return true;
}
}