diff options
Diffstat (limited to 'src/com/cyanogenmod/filemanager/ui/widgets/DirectoryInlineAutocompleteTextView.java')
-rw-r--r-- | src/com/cyanogenmod/filemanager/ui/widgets/DirectoryInlineAutocompleteTextView.java | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/DirectoryInlineAutocompleteTextView.java b/src/com/cyanogenmod/filemanager/ui/widgets/DirectoryInlineAutocompleteTextView.java new file mode 100644 index 00000000..498f017b --- /dev/null +++ b/src/com/cyanogenmod/filemanager/ui/widgets/DirectoryInlineAutocompleteTextView.java @@ -0,0 +1,186 @@ +/* + * Copyright (C) 2012 The CyanogenMod 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.cyanogenmod.filemanager.ui.widgets; + +import android.content.Context; +import android.util.AttributeSet; +import android.util.Log; + +import com.cyanogenmod.filemanager.util.CommandHelper; +import com.cyanogenmod.filemanager.util.FileHelper; + +import java.io.File; +import java.util.List; + +/** + * A widget based on {@link InlineAutocompleteTextView} for autocomplete + * directories like a bash console do (with tab key). + */ +public class DirectoryInlineAutocompleteTextView + extends InlineAutocompleteTextView + implements InlineAutocompleteTextView.OnTextChangedListener { + + /** + * An interface to communicate validation events. + */ + public interface OnValidationListener { + /** + * Method invoked when the value is void. + */ + void onVoidValue(); + /** + * Method invoked when the value is a valid value. + */ + void onValidValue(); + /** + * Method invoked when the value is a invalid value. + */ + void onInvalidValue(); + } + + private static final String TAG = "DirectoryInlineAutocompleteTextView"; //$NON-NLS-1$ + + private OnValidationListener mOnValidationListener; + private String mLastParent; + + /** + * Constructor of <code>DirectoryInlineAutocompleteTextView</code>. + * + * @param context The current context + */ + public DirectoryInlineAutocompleteTextView(Context context) { + super(context); + init(); + } + + /** + * Constructor of <code>DirectoryInlineAutocompleteTextView</code>. + * + * @param context The current context + * @param attrs The attributes of the XML tag that is inflating the view. + */ + public DirectoryInlineAutocompleteTextView(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } + + /** + * Constructor of <code>DirectoryInlineAutocompleteTextView</code>. + * + * @param context The current context + * @param attrs The attributes of the XML tag that is inflating the view. + * @param defStyle The default style to apply to this view. If 0, no style + * will be applied (beyond what is included in the theme). This may + * either be an attribute resource, whose value will be retrieved + * from the current theme, or an explicit style resource. + */ + public DirectoryInlineAutocompleteTextView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(); + } + + /** + * Method that initializes the view. This method loads all the necessary + * information and create an appropriate layout for the view + */ + private void init() { + //Sets last parent + this.mLastParent = ""; //$NON-NLS-1$ + + //Set the listener + setOnTextChangedListener(this); + setCompletionString(File.separator); + } + + /** + * Method that set the listener for retrieve validation events. + * + * @param onValidationListener The listener for retrieve validation events + */ + public void setOnValidationListener(OnValidationListener onValidationListener) { + this.mOnValidationListener = onValidationListener; + } + + /** + * {@inheritDoc} + */ + @Override + public void onTextChanged(String newValue, List<String> currentFilterData) { + String value = newValue; + + //Check if directory is valid + if (value.length() == 0) { + if (this.mOnValidationListener != null) { + this.mOnValidationListener.onVoidValue(); + } + } else { + boolean relative = FileHelper.isRelativePath(value); + if (relative) { + if (this.mOnValidationListener != null) { + this.mOnValidationListener.onInvalidValue(); + } + } else { + if (this.mOnValidationListener != null) { + this.mOnValidationListener.onValidValue(); + } + } + } + + //Ensure data + if (!value.startsWith(FileHelper.ROOT_DIRECTORY)) { + currentFilterData.clear(); + this.mLastParent = ""; //$NON-NLS-1$ + return; + } + + //Get the new parent + String newParent = new File(value).getParent(); + if (newParent == null) { + newParent = FileHelper.ROOT_DIRECTORY; + } + if (!newParent.endsWith(FileHelper.ROOT_DIRECTORY)) { + newParent += FileHelper.ROOT_DIRECTORY; + } + if (value.compareTo(FileHelper.ROOT_DIRECTORY) == 0) { + newParent = FileHelper.ROOT_DIRECTORY; + currentFilterData.clear(); + } else if (value.endsWith(FileHelper.ROOT_DIRECTORY)) { + //Force the change of parent + newParent = new File(value, "a").getParent(); //$NON-NLS-1$ + if (!newParent.endsWith(FileHelper.ROOT_DIRECTORY)) { + newParent += FileHelper.ROOT_DIRECTORY; + } + currentFilterData.clear(); + } else { + value = newParent; + } + + //If a new path is detected, then load the new data + if (newParent.compareTo(this.mLastParent) != 0 || currentFilterData.isEmpty()) { + this.mLastParent = newParent; + currentFilterData.clear(); + try { + List<String> newData = + CommandHelper.quickFolderSearch(getContext(), value, null); + currentFilterData.addAll(newData); + } catch (Throwable ex) { + Log.e(TAG, "Quick folder search failed", ex); //$NON-NLS-1$ + currentFilterData.clear(); + } + } + } +} |