1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Eclipse Public License, Version 1.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.eclipse.org/org/documents/epl-v10.php 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.ide.eclipse.adt.internal.assetstudio; 18 19 import com.android.ide.eclipse.adt.internal.project.ProjectChooserHelper; 20 import com.android.ide.eclipse.adt.internal.project.ProjectChooserHelper.ProjectCombo; 21 import com.android.ide.eclipse.adt.internal.resources.ResourceNameValidator; 22 import com.android.resources.ResourceFolderType; 23 24 import org.eclipse.jface.dialogs.IMessageProvider; 25 import org.eclipse.jface.wizard.WizardPage; 26 import org.eclipse.swt.SWT; 27 import org.eclipse.swt.dnd.Clipboard; 28 import org.eclipse.swt.dnd.TextTransfer; 29 import org.eclipse.swt.dnd.Transfer; 30 import org.eclipse.swt.events.ModifyEvent; 31 import org.eclipse.swt.events.ModifyListener; 32 import org.eclipse.swt.events.SelectionEvent; 33 import org.eclipse.swt.events.SelectionListener; 34 import org.eclipse.swt.layout.GridData; 35 import org.eclipse.swt.layout.GridLayout; 36 import org.eclipse.swt.widgets.Button; 37 import org.eclipse.swt.widgets.Composite; 38 import org.eclipse.swt.widgets.Label; 39 import org.eclipse.swt.widgets.Text; 40 41 /** Page for choosing the type of asset to create, as well as the target project */ 42 public class ChooseAssetTypePage extends WizardPage implements SelectionListener, ModifyListener { 43 private final CreateAssetSetWizardState mValues; 44 private ProjectCombo mProjectButton; 45 private Button mClipboardButton; 46 private Text mNameText; 47 private boolean mNameModified; 48 private Label mResourceName; 49 50 /** 51 * Create the wizard. 52 */ 53 public ChooseAssetTypePage(CreateAssetSetWizardState values) { 54 super("chooseAssetTypePage"); 55 mValues = values; 56 setTitle("Choose Icon Set Type"); 57 setDescription("Select the type of icon set to create:"); 58 } 59 60 /** 61 * Create contents of the wizard. 62 * 63 * @param parent the parent composite 64 */ 65 @Override 66 public void createControl(Composite parent) { 67 Composite container = new Composite(parent, SWT.NULL); 68 69 setControl(container); 70 container.setLayout(new GridLayout(3, false)); 71 72 for (AssetType type : AssetType.values()) { 73 Button button = new Button(container, SWT.RADIO); 74 button.setData(type); 75 button.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1)); 76 button.setSelection(type == mValues.type); 77 button.setText(type.getDisplayName()); 78 button.addSelectionListener(this); 79 } 80 81 Label separator = new Label(container, SWT.SEPARATOR | SWT.HORIZONTAL); 82 GridData gdSeparator = new GridData(SWT.FILL, SWT.CENTER, false, false, 3, 1); 83 gdSeparator.heightHint = 20; 84 separator.setLayoutData(gdSeparator); 85 86 Label projectLabel = new Label(container, SWT.NONE); 87 projectLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); 88 projectLabel.setText("Project:"); 89 90 ProjectChooserHelper helper = 91 new ProjectChooserHelper(getShell(), null /* filter */); 92 mProjectButton = new ProjectCombo(helper, container, mValues.project); 93 mProjectButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1)); 94 mProjectButton.addSelectionListener(this); 95 96 Label assetLabel = new Label(container, SWT.NONE); 97 assetLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); 98 assetLabel.setText("Icon Name:"); 99 100 mNameText = new Text(container, SWT.BORDER); 101 mNameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1)); 102 mNameText.addModifyListener(this); 103 104 Label resourceLabel = new Label(container, SWT.NONE); 105 resourceLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); 106 resourceLabel.setText("Resource:"); 107 108 mResourceName = new Label(container, SWT.NONE); 109 mResourceName.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); 110 111 mClipboardButton = new Button(container, SWT.FLAT); 112 mClipboardButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); 113 mClipboardButton.setText("Copy Name to Clipboard"); 114 115 mClipboardButton.addSelectionListener(this); 116 117 updateAssetType(); 118 validatePage(); 119 parent.getDisplay().asyncExec(new Runnable() { 120 @Override 121 public void run() { 122 mNameText.setFocus(); 123 } 124 }); 125 } 126 127 private void updateAssetType() { 128 if (!mNameModified) { 129 // Default name suggestion, possibly as a suffix, e.g. "ic_menu_<name>" 130 String replace = "name"; 131 String suggestedName = String.format(mValues.type.getDefaultNameFormat(), replace); 132 mNameText.setText(suggestedName); 133 mValues.outputName = suggestedName; 134 135 updateResourceLabel(); 136 mNameModified = false; 137 int start = suggestedName.indexOf(replace); 138 if (start != -1) { 139 mNameText.setSelection(start, start + replace.length()); 140 } else { 141 mNameText.selectAll(); 142 } 143 } else { 144 mNameText.selectAll(); 145 } 146 } 147 148 private void updateResourceLabel() { 149 mResourceName.setText("@drawable/" + getOutputName()); //$NON-NLS-1$ 150 } 151 152 @Override 153 public boolean canFlipToNextPage() { 154 return mValues.project != null; 155 } 156 157 @Override 158 public void widgetSelected(SelectionEvent e) { 159 Object source = e.getSource(); 160 if (source == mProjectButton) { 161 mValues.project = mProjectButton.getSelectedProject(); 162 validatePage(); 163 } else if (source == mClipboardButton) { 164 Clipboard clipboard = new Clipboard(getShell().getDisplay()); 165 TextTransfer textTransfer = TextTransfer.getInstance(); 166 clipboard.setContents( 167 new Object[] { mResourceName.getText() }, 168 new Transfer[] { textTransfer }); 169 clipboard.dispose(); 170 } else if (source instanceof Button) { 171 // User selected a different asset type to be created 172 Object data = ((Button) source).getData(); 173 if (data instanceof AssetType) { 174 mValues.type = (AssetType) data; 175 CreateAssetSetWizardState.sLastType = mValues.type; 176 updateAssetType(); 177 } 178 } 179 } 180 181 @Override 182 public void widgetDefaultSelected(SelectionEvent e) { 183 } 184 185 @Override 186 public void modifyText(ModifyEvent e) { 187 Object source = e.getSource(); 188 if (source == mNameText) { 189 mNameModified = true; 190 mValues.outputName = mNameText.getText().trim(); 191 updateResourceLabel(); 192 } 193 194 validatePage(); 195 } 196 197 private String getOutputName() { 198 return mNameText.getText().trim(); 199 } 200 201 private void validatePage() { 202 String error = null; 203 204 if (mValues.project == null) { 205 error = "Please select an Android project."; 206 } else { 207 String outputName = getOutputName(); 208 if (outputName == null || outputName.length() == 0) { 209 error = "Please enter a name"; 210 } else { 211 ResourceNameValidator validator = 212 ResourceNameValidator.create(true, ResourceFolderType.DRAWABLE); 213 error = validator.isValid(outputName); 214 } 215 } 216 217 setPageComplete(error == null); 218 if (error != null) { 219 setMessage(error, IMessageProvider.ERROR); 220 } else { 221 setErrorMessage(null); 222 setMessage(null); 223 } 224 } 225 } 226