/* * 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.motorolamobility.studio.android.db.core.ui.wizards.createdb; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ITreeSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeNode; import org.eclipse.jface.viewers.TreeNodeContentProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; 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.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; import com.motorolamobility.studio.android.db.core.DbCoreActivator; import com.motorolamobility.studio.android.db.core.i18n.DbCoreNLS; import com.motorolamobility.studio.android.db.core.model.TableModel; import com.motorolamobility.studio.android.db.core.ui.wizards.CreateTableWizard; import com.motorolamobility.studio.android.db.core.ui.wizards.TableLabelProvider; public class CreateDatabaseWizardPage extends WizardPage { private Text databaseName; private Button addButton = null; private Button editButton = null; private Button removeButton = null; private boolean isPageComplete = false; // private final String DATABASE_CONTEXT_HELP_ID = DbPlugin.PLUGIN_ID + ".create_database_wizard"; /** * This page's tree viewer */ private TreeViewer viewer; /** * Tree viewer input */ private final TreeNode[] treeNodeArray = new TreeNode[0]; private final List<String> alreadyAvailableDbs; private final List<TableModel> tables = new ArrayList<TableModel>(); private final String DATABASE_CONTEXT_HELP_ID = DbCoreActivator.PLUGIN_ID + ".create_database_wizard"; //$NON-NLS-1$ /** * @param alreadyAvailableDbs * @param pageName */ protected CreateDatabaseWizardPage(final List<String> alreadyAvailableDbs) { super(DbCoreNLS.CreateDatabaseWizardPage_UI_PageTitle); setTitle(DbCoreNLS.CreateDatabaseWizardPage_UI_CreateNewDatabase); setMessage(DbCoreNLS.CreateDatabaseWizardPage_UI_CreateNewDBAddingItsFields); this.alreadyAvailableDbs = alreadyAvailableDbs; } /* (non-Javadoc) * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite) */ public void createControl(Composite parent) { Composite composite = new Composite(parent, SWT.FILL); composite.setLayout(new GridLayout(2, false)); GridData layoutData = new GridData(SWT.FILL, SWT.NONE, true, false); Composite nameComposite = new Composite(composite, SWT.FILL); nameComposite.setLayout(new GridLayout(2, false)); nameComposite.setLayoutData(layoutData); layoutData = new GridData(SWT.LEFT, SWT.NONE, false, false); Label dbNameLabel = new Label(nameComposite, SWT.NONE); dbNameLabel.setLayoutData(layoutData); dbNameLabel.setText(DbCoreNLS.CreateDatabaseWizardPage_DB_Name_Label); layoutData = new GridData(SWT.FILL, SWT.NONE, true, false); databaseName = new Text(nameComposite, SWT.BORDER | SWT.SINGLE); databaseName.setLayoutData(layoutData); databaseName.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { validatePage(); getContainer().updateButtons(); } }); Composite emptyComposite = new Composite(composite, SWT.RIGHT); emptyComposite.setLayout(new GridLayout(1, false)); emptyComposite.layout(); Group tableGroup = new Group(composite, SWT.FILL); GridLayout gridLayout = new GridLayout(2, false); GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true); tableGroup.setLayout(gridLayout); tableGroup.setLayoutData(gridData); tableGroup.setText(DbCoreNLS.CreateDatabaseWizardPage_Table_Group); viewer = new TreeViewer(tableGroup, SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL); viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); // Set content and label provider viewer.setLabelProvider(new TableLabelProvider()); viewer.setContentProvider(new TreeNodeContentProvider()); viewer.setInput(treeNodeArray); layoutData = new GridData(SWT.FILL, SWT.FILL, true, true); viewer.getTree().setLayoutData(layoutData); viewer.addSelectionChangedListener(new TreeViewerListener()); Composite buttonBar = new Composite(tableGroup, SWT.NONE); layoutData = new GridData(SWT.RIGHT, SWT.TOP, false, true); buttonBar.setLayoutData(layoutData); buttonBar.setLayout(new FillLayout(SWT.VERTICAL)); addButton = new Button(buttonBar, SWT.PUSH); addButton.setText(DbCoreNLS.CreateDatabaseWizardPage_Add_Button); addButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { boolean tableAdded = false; // loop used to validate the new table name. If it already exists // tell the user and open the table wizard again. while (!tableAdded) { CreateTableWizard createTableWizard = new CreateTableWizard(); WizardDialog dialog = new WizardDialog(getShell(), createTableWizard); dialog.open(); if (dialog.getReturnCode() == Dialog.OK) { TableModel newTable = createTableWizard.getTable(); if (newTable != null) { boolean tableNameAlreadyExists = false; for (TableModel tableModel : tables) { if (tableModel.getName().equalsIgnoreCase(newTable.getName())) { tableNameAlreadyExists = true; break; } } if (!tableNameAlreadyExists) { tables.add(newTable); ArrayList<TreeNode> treeNodeColletion = new ArrayList<TreeNode>(); treeNodeColletion.addAll(Arrays.asList((TreeNode[]) viewer .getInput())); TreeNode treeNode = new TreeNode(newTable); treeNodeColletion.add(treeNode); viewer.setInput(treeNodeColletion.toArray(new TreeNode[0])); tableAdded = true; } else { MessageDialog .openError( getShell(), DbCoreNLS.CreateDatabaseWizardPage_Table_Already_Exists_Title, NLS.bind( DbCoreNLS.CreateDatabaseWizardPage_Table_Already_Exists_Msg, newTable.getName())); } } } else { break; } } } }); editButton = new Button(buttonBar, SWT.PUSH); editButton.setText(DbCoreNLS.CreateDatabaseWizardPage_Edit_Button); editButton.setEnabled(false); editButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { TreeNode selectedNode = null; if (viewer.getSelection() instanceof ITreeSelection) { ITreeSelection treeSelection = (ITreeSelection) viewer.getSelection(); selectedNode = (TreeNode) treeSelection.getFirstElement(); TableModel table = (TableModel) selectedNode.getValue(); CreateTableWizard createTableWizard = new CreateTableWizard(); createTableWizard.init(table); WizardDialog dialog = new WizardDialog(getShell(), createTableWizard); dialog.open(); TableModel newTable = createTableWizard.getTable(); if (newTable != null) { tables.add(newTable); } viewer.refresh(); } } }); removeButton = new Button(buttonBar, SWT.PUSH); removeButton.setText(DbCoreNLS.CreateDatabaseWizardPage_Remove_Button); removeButton.setEnabled(false); removeButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { ArrayList<TreeNode> treeNodeColletion = new ArrayList<TreeNode>(); treeNodeColletion.addAll(Arrays.asList((TreeNode[]) viewer.getInput())); TreeNode selectedNode = null; if (viewer.getSelection() instanceof ITreeSelection) { ITreeSelection treeSelection = (ITreeSelection) viewer.getSelection(); selectedNode = (TreeNode) treeSelection.getFirstElement(); treeNodeColletion.remove(selectedNode); viewer.setInput(treeNodeColletion.toArray(new TreeNode[0])); } } }); composite.pack(); composite.layout(); setPageComplete(false); setErrorMessage(null); setControl(composite); PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, DATABASE_CONTEXT_HELP_ID); PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, DATABASE_CONTEXT_HELP_ID); } /** * Validates the database name. */ private void validatePage() { DatabaseCreationFieldValidator validator = new DatabaseCreationFieldValidator(alreadyAvailableDbs); String errorMessage = validator.isValid(getDatabaseName()); if (errorMessage != null) { setErrorMessage(errorMessage); isPageComplete = false; } else { setErrorMessage(null); isPageComplete = true; } } /* (non-Javadoc) * @see org.eclipse.jface.wizard.WizardPage#isPageComplete() */ @Override public boolean isPageComplete() { return isPageComplete; } /** * Return the database name that is in databaseName field. * @return */ public String getDatabaseName() { return databaseName.getText().trim(); } /** * Return tables that are in the tree viewer. * * @return */ public List<TableModel> getTables() { List<TreeNode> treeNodeColletion = new ArrayList<TreeNode>(); treeNodeColletion.addAll(Arrays.asList((TreeNode[]) viewer.getInput())); List<TableModel> tableCollection = new ArrayList<TableModel>(); for (TreeNode node : treeNodeColletion) { tableCollection.add((TableModel) node.getValue()); } return tableCollection; } /** * Selection listener for the tree viewer */ class TreeViewerListener implements ISelectionChangedListener { /* (non-Javadoc) * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent) */ public void selectionChanged(SelectionChangedEvent event) { if (event.getSelection() instanceof ITreeSelection) { ITreeSelection treeSelection = (ITreeSelection) event.getSelection(); if (!treeSelection.isEmpty()) { editButton.setEnabled(true); removeButton.setEnabled(true); } else { editButton.setEnabled(false); removeButton.setEnabled(false); } } } } }