You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pivot.apache.org by gb...@apache.org on 2009/08/18 17:40:20 UTC

svn commit: r805458 - in /incubator/pivot/trunk/wtk: src/org/apache/pivot/wtk/ src/org/apache/pivot/wtk/skin/terra/ test/org/apache/pivot/wtk/test/

Author: gbrown
Date: Tue Aug 18 15:40:20 2009
New Revision: 805458

URL: http://svn.apache.org/viewvc?rev=805458&view=rev
Log:
Implement support for selection modes in TerraFileBrowserSheetSkin.

Modified:
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/FileBrowserSheet.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/FileBrowserSheetListener.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/TextInput.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraFileBrowserSheetSkin.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/terra_file_browser_sheet_skin.wtkx
    incubator/pivot/trunk/wtk/test/org/apache/pivot/wtk/test/FileBrowserSheetTest.java

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/FileBrowserSheet.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/FileBrowserSheet.java?rev=805458&r1=805457&r2=805458&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/FileBrowserSheet.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/FileBrowserSheet.java Tue Aug 18 15:40:20 2009
@@ -42,12 +42,6 @@
 
     private static class FileBrowserSheetListenerList extends ListenerList<FileBrowserSheetListener>
         implements FileBrowserSheetListener {
-        public void multiSelectChanged(FileBrowserSheet fileBrowserSheet) {
-            for (FileBrowserSheetListener listener : this) {
-                listener.multiSelectChanged(fileBrowserSheet);
-            }
-        }
-
         public void selectedFolderChanged(FileBrowserSheet fileBrowserSheet, Folder previousSelectedFolder) {
             for (FileBrowserSheetListener listener : this) {
                 listener.selectedFolderChanged(fileBrowserSheet, previousSelectedFolder);
@@ -71,7 +65,6 @@
     private Mode mode;
     private Folder selectedFolder;
     private FileList fileSelection = new FileList();
-    private boolean multiSelect = false;
     private Filter<File> disabledFileFilter = null;
 
     private FileBrowserSheetListenerList fileBrowserSheetListeners = new FileBrowserSheetListenerList();
@@ -116,7 +109,7 @@
      * The currently selected file.
      */
     public File getSelectedFile() {
-        if (multiSelect) {
+        if (mode == Mode.OPEN_MULTIPLE) {
             throw new IllegalStateException("File browser is not in single-select mode.");
         }
 
@@ -162,7 +155,7 @@
             throw new IllegalArgumentException("selectedFiles is null.");
         }
 
-        if (!multiSelect
+        if (mode != Mode.OPEN_MULTIPLE
             && selectedFiles.getLength() > 1) {
             throw new IllegalArgumentException("Multi-select is not enabled.");
         }
@@ -196,21 +189,6 @@
         setSelectedFiles(new ArrayList<File>());
     }
 
-    public boolean isMultiSelect() {
-        return multiSelect;
-    }
-
-    public void setMultiSelect(boolean multiSelect) {
-        if (this.multiSelect != multiSelect) {
-            // Clear any existing selection
-            fileSelection.clear();
-
-            this.multiSelect = multiSelect;
-
-            fileBrowserSheetListeners.multiSelectChanged(this);
-        }
-    }
-
     public Filter<File> getDisabledFileFilter() {
         return disabledFileFilter;
     }

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/FileBrowserSheetListener.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/FileBrowserSheetListener.java?rev=805458&r1=805457&r2=805458&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/FileBrowserSheetListener.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/FileBrowserSheetListener.java Tue Aug 18 15:40:20 2009
@@ -30,9 +30,6 @@
      * File browser sheet listener adapter.
      */
     public static class Adapter implements FileBrowserSheetListener {
-        public void multiSelectChanged(FileBrowserSheet fileBrowserSheet) {
-        }
-
         public void selectedFolderChanged(FileBrowserSheet fileBrowserSheet,
             Folder previousSelectedFolder) {
         }
@@ -47,13 +44,6 @@
     }
 
     /**
-     * Called when a file browser sheet's multi-select flag has changed.
-     *
-     * @param fileBrowserSheet
-     */
-    public void multiSelectChanged(FileBrowserSheet fileBrowserSheet);
-
-    /**
      * Called when a file browser sheet's selected folder has changed.
      *
      * @param fileBrowserSheet

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/TextInput.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/TextInput.java?rev=805458&r1=805457&r2=805458&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/TextInput.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/TextInput.java Tue Aug 18 15:40:20 2009
@@ -216,7 +216,7 @@
             // Clear the selection
             this.textNode = textNode;
 
-            selectionStart = textNode.getCharacterCount();
+            selectionStart = 0;
             selectionLength = 0;
 
             textInputListeners.textNodeChanged(this, previousTextNode);
@@ -289,6 +289,10 @@
         }
     }
 
+    public int getTextLength() {
+        return textNode.getCharacterCount();
+    }
+
     public void delete(Direction direction) {
         if (direction == null) {
             throw new IllegalArgumentException("direction is null.");

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraFileBrowserSheetSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraFileBrowserSheetSkin.java?rev=805458&r1=805457&r2=805458&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraFileBrowserSheetSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraFileBrowserSheetSkin.java Tue Aug 18 15:40:20 2009
@@ -19,19 +19,25 @@
 import java.io.File;
 import java.io.IOException;
 
+import org.apache.pivot.collections.ArrayList;
 import org.apache.pivot.collections.Sequence;
 import org.apache.pivot.io.Folder;
 import org.apache.pivot.serialization.SerializationException;
 import org.apache.pivot.util.Filter;
 import org.apache.pivot.util.Resources;
+import org.apache.pivot.util.Vote;
 import org.apache.pivot.wtk.Button;
 import org.apache.pivot.wtk.ButtonPressListener;
 import org.apache.pivot.wtk.Component;
 import org.apache.pivot.wtk.FileBrowser;
+import org.apache.pivot.wtk.FileBrowserListener;
 import org.apache.pivot.wtk.FileBrowserSheet;
 import org.apache.pivot.wtk.FileBrowserSheetListener;
 import org.apache.pivot.wtk.PushButton;
+import org.apache.pivot.wtk.Sheet;
+import org.apache.pivot.wtk.TablePane;
 import org.apache.pivot.wtk.TextInput;
+import org.apache.pivot.wtk.TextInputTextListener;
 import org.apache.pivot.wtkx.WTKX;
 import org.apache.pivot.wtkx.WTKXSerializer;
 
@@ -39,19 +45,24 @@
  * Terra file browser sheet skin.
  */
 public class TerraFileBrowserSheetSkin extends TerraSheetSkin implements FileBrowserSheetListener {
+    @WTKX private TablePane tablePane = null;
+    @WTKX private TablePane.Row saveAsRow = null;
     @WTKX private TextInput saveAsTextInput = null;
     @WTKX private FileBrowser fileBrowser = null;
     @WTKX private PushButton okButton = null;
     @WTKX private PushButton cancelButton = null;
 
     private boolean updatingSelection = false;
+    private int selectedDirectoryCount = 0;
 
     @Override
     public void install(Component component) {
         super.install(component);
 
         final FileBrowserSheet fileBrowserSheet = (FileBrowserSheet)component;
+        final FileBrowserSheet.Mode mode = fileBrowserSheet.getMode();
 
+        // Load the sheet content
         Resources resources;
         try {
             resources = new Resources(this);
@@ -76,17 +87,66 @@
 
         wtkxSerializer.bind(this, TerraFileBrowserSheetSkin.class);
 
-        okButton.getButtonPressListeners().add(new ButtonPressListener() {
-            public void buttonPressed(Button button) {
-                updatingSelection = true;
+        saveAsTextInput.getTextInputTextListeners().add(new TextInputTextListener() {
+            public void textChanged(TextInput textInput) {
+                updateOKButtonState();
+            }
+        });
+
+        fileBrowser.getFileBrowserListeners().add(new FileBrowserListener.Adapter() {
+            public void selectedFileAdded(FileBrowser fileBrowser, File file) {
+                file = new File(fileBrowser.getSelectedFolder(), file.getName());
+
+                if (file.isDirectory()) {
+                    selectedDirectoryCount++;
+                }
+
+                updateOKButtonState();
+            }
 
-                // TODO If SAVE_AS, get value from saveAsTextInput
-                saveAsTextInput.getText();
+            public void selectedFileRemoved(FileBrowser fileBrowser, File file) {
+                file = new File(fileBrowser.getSelectedFolder(), file.getName());
 
-                fileBrowserSheet.setSelectedFiles(fileBrowser.getSelectedFiles());
+                if (file.isDirectory()) {
+                    selectedDirectoryCount--;
+                }
 
-                updatingSelection = false;
+                updateOKButtonState();
+            }
+
+            public void selectedFilesChanged(FileBrowser fileBrowser,
+                Sequence<File> previousSelectedFiles) {
+                selectedDirectoryCount = 0;
+
+                Sequence<File> selectedFiles = fileBrowser.getSelectedFiles();
+                for (int i = 0, n = selectedFiles.getLength(); i < n; i++) {
+                    File selectedFile = selectedFiles.get(i);
+                    selectedFile = new File(fileBrowser.getSelectedFolder(), selectedFile.getName());
+
+                    if (selectedFile.isDirectory()) {
+                        selectedDirectoryCount++;
+                    }
+                }
+
+                if (!fileBrowser.isMultiSelect()) {
+                    File selectedFile = fileBrowser.getSelectedFile();
+
+                    if (selectedFile == null) {
+                        saveAsTextInput.setText("");
+                    } else {
+                        selectedFile = new File(fileBrowser.getSelectedFolder(), selectedFile.getName());
+                        if (!selectedFile.isDirectory()) {
+                            saveAsTextInput.setText(selectedFile.getName());
+                        }
+                    }
+                }
 
+                updateOKButtonState();
+            }
+        });
+
+        okButton.getButtonPressListeners().add(new ButtonPressListener() {
+            public void buttonPressed(Button button) {
                 fileBrowserSheet.close(true);
             }
         });
@@ -97,25 +157,105 @@
             }
         });
 
+
+        // Add this as a file browser sheet listener
         fileBrowserSheet.getFileBrowserSheetListeners().add(this);
+
+        // Initialize layout and file browser selection state
+        switch (mode) {
+            case OPEN: {
+                if (saveAsRow.getTablePane() != null) {
+                    tablePane.getRows().remove(saveAsRow);
+                }
+
+                fileBrowser.setMultiSelect(false);
+                break;
+            }
+
+            case OPEN_MULTIPLE: {
+                if (saveAsRow.getTablePane() != null) {
+                    tablePane.getRows().remove(saveAsRow);
+                }
+
+                fileBrowser.setMultiSelect(true);
+                break;
+            }
+
+            case SAVE_AS: {
+                if (saveAsRow.getTablePane() == null) {
+                    tablePane.getRows().insert(saveAsRow, 0);
+                }
+
+                fileBrowser.setMultiSelect(false);
+                break;
+            }
+
+            case SAVE_TO: {
+                if (saveAsRow.getTablePane() != null) {
+                    tablePane.getRows().remove(saveAsRow);
+                }
+
+                fileBrowser.setMultiSelect(false);
+                break;
+            }
+        }
+
+        selectedFolderChanged(fileBrowserSheet, null);
+        selectedFilesChanged(fileBrowserSheet, null);
+        disabledFileFilterChanged(fileBrowserSheet, null);
     }
 
     @Override
     public void uninstall() {
         FileBrowserSheet fileBrowserSheet = (FileBrowserSheet)getComponent();
-        fileBrowserSheet.setContent(null);
 
+        fileBrowserSheet.setContent(null);
         fileBrowserSheet.getFileBrowserSheetListeners().remove(this);
 
         super.uninstall();
     }
 
-    public void multiSelectChanged(FileBrowserSheet fileBrowserSheet) {
-        // TODO
+    @Override
+    public Vote previewSheetClose(final Sheet sheet, final boolean result) {
+        Vote vote;
+
+        if (result
+            && !okButton.isEnabled()) {
+            vote = Vote.DENY;
+        } else {
+            vote = super.previewSheetClose(sheet, result);
+        }
+
+        if (vote == Vote.APPROVE) {
+            updatingSelection = true;
+
+            FileBrowserSheet fileBrowserSheet = (FileBrowserSheet)sheet;
+            FileBrowserSheet.Mode mode = fileBrowserSheet.getMode();
+
+            switch (mode) {
+                case OPEN:
+                case OPEN_MULTIPLE:
+                case SAVE_TO: {
+                    fileBrowserSheet.setSelectedFiles(fileBrowser.getSelectedFiles());
+                    break;
+                }
+
+                case SAVE_AS: {
+                    String fileName = saveAsTextInput.getText();
+                    File selectedFile = new File(fileName);
+                    fileBrowserSheet.setSelectedFiles(new ArrayList<File>(selectedFile));
+                    break;
+                }
+            }
+
+            updatingSelection = false;
+        }
+
+        return vote;
     }
 
     public void selectedFolderChanged(FileBrowserSheet fileBrowserSheet, Folder previousSelectedFolder) {
-        // TODO
+        fileBrowser.setSelectedFolder(fileBrowserSheet.getSelectedFolder());
     }
 
     public void selectedFilesChanged(FileBrowserSheet fileBrowserSheet, Sequence<File> previousSelectedFiles) {
@@ -125,6 +265,33 @@
     }
 
     public void disabledFileFilterChanged(FileBrowserSheet fileBrowserSheet, Filter<File> previousFileFilter) {
-        // TODO
+        fileBrowser.setDisabledFileFilter(fileBrowserSheet.getDisabledFileFilter());
+    }
+
+    private void updateOKButtonState() {
+        FileBrowserSheet fileBrowserSheet = (FileBrowserSheet)getComponent();
+
+        FileBrowserSheet.Mode mode = fileBrowserSheet.getMode();
+        Sequence<File> selectedFiles = fileBrowser.getSelectedFiles();
+
+        switch (mode) {
+            case OPEN:
+            case OPEN_MULTIPLE: {
+                okButton.setEnabled(selectedFiles.getLength() > 0
+                    && selectedDirectoryCount == 0);
+                break;
+            }
+
+            case SAVE_AS: {
+                okButton.setEnabled(saveAsTextInput.getTextLength() > 0);
+                break;
+            }
+
+            case SAVE_TO: {
+                okButton.setEnabled(selectedDirectoryCount > 0);
+                break;
+            }
+        }
+
     }
 }

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/terra_file_browser_sheet_skin.wtkx
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/terra_file_browser_sheet_skin.wtkx?rev=805458&r1=805457&r2=805458&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/terra_file_browser_sheet_skin.wtkx (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/terra_file_browser_sheet_skin.wtkx Tue Aug 18 15:40:20 2009
@@ -21,20 +21,20 @@
     xmlns="org.apache.pivot.wtk">
     <Border styles="{padding:10}">
         <content>
-            <TablePane styles="{verticalSpacing:8}">
+            <TablePane wtkx:id="tablePane" styles="{verticalSpacing:8}">
                 <columns>
                     <TablePane.Column width="1*"/>
                 </columns>
                 <rows>
-                    <TablePane.Row height="-1">
-                        <BoxPane styles="{verticalAlignment:'center'}">
-                            <Label text="%saveAs"/>
-                            <TextInput wtkx:id="saveAsTextInput"/>
+                    <TablePane.Row wtkx:id="saveAsRow" height="-1">
+                        <BoxPane orientation="vertical" styles="{fill:true}">
+                            <BoxPane styles="{verticalAlignment:'center'}">
+                                <Label text="%saveAs"/>
+                                <TextInput wtkx:id="saveAsTextInput" textSize="32"/>
+                            </BoxPane>
+                            <Separator styles="{padding:2}"/>
                         </BoxPane>
                     </TablePane.Row>
-                    <TablePane.Row>
-                        <Separator styles="{padding:2}"/>
-                    </TablePane.Row>
                     <TablePane.Row height="1*">
                         <FileBrowser wtkx:id="fileBrowser"
                             preferredWidth="420" preferredHeight="220"/>

Modified: incubator/pivot/trunk/wtk/test/org/apache/pivot/wtk/test/FileBrowserSheetTest.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/test/org/apache/pivot/wtk/test/FileBrowserSheetTest.java?rev=805458&r1=805457&r2=805458&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/test/org/apache/pivot/wtk/test/FileBrowserSheetTest.java (original)
+++ incubator/pivot/trunk/wtk/test/org/apache/pivot/wtk/test/FileBrowserSheetTest.java Tue Aug 18 15:40:20 2009
@@ -31,7 +31,7 @@
         throws Exception {
         WTKXSerializer wtkxSerializer = new WTKXSerializer();
 
-        FileBrowserSheet fileOpenSheet = new FileBrowserSheet(FileBrowserSheet.Mode.OPEN);
+        FileBrowserSheet fileOpenSheet = new FileBrowserSheet(FileBrowserSheet.Mode.SAVE_TO);
         wtkxSerializer.put("fileOpenSheet", fileOpenSheet);
 
         frame = (Frame)wtkxSerializer.readObject(getClass().getResource("file_browser_sheet_test.wtkx"));