Skip to content

Commit

Permalink
persist files pane sorting config
Browse files Browse the repository at this point in the history
  • Loading branch information
jjallaire committed Apr 27, 2011
1 parent 190fe74 commit 39ebf81
Show file tree
Hide file tree
Showing 4 changed files with 200 additions and 26 deletions.
Expand Up @@ -19,9 +19,11 @@
import com.google.gwt.user.client.Command;
import com.google.inject.Inject;
import com.google.inject.Provider;

import org.rstudio.core.client.command.CommandBinder;
import org.rstudio.core.client.command.Handler;
import org.rstudio.core.client.files.FileSystemItem;
import org.rstudio.core.client.js.JsObject;
import org.rstudio.core.client.widget.OperationWithInput;
import org.rstudio.core.client.widget.ProgressIndicator;
import org.rstudio.core.client.widget.ProgressOperation;
Expand All @@ -41,14 +43,17 @@
import org.rstudio.studio.client.workbench.model.RemoteFileSystemContext;
import org.rstudio.studio.client.workbench.model.Session;
import org.rstudio.studio.client.workbench.model.SessionInfo;
import org.rstudio.studio.client.workbench.model.helper.JSObjectStateValue;
import org.rstudio.studio.client.workbench.model.helper.StringStateValue;
import org.rstudio.studio.client.workbench.views.BasePresenter;
import org.rstudio.studio.client.workbench.views.files.events.*;
import org.rstudio.studio.client.workbench.views.files.model.FileChange;
import org.rstudio.studio.client.workbench.views.files.model.FilesColumnSortInfo;
import org.rstudio.studio.client.workbench.views.files.model.FilesServerOperations;
import org.rstudio.studio.client.workbench.views.files.model.PendingFileUpload;

import java.util.ArrayList;
import java.util.List;

public class Files
extends BasePresenter
Expand All @@ -70,9 +75,13 @@ public interface NavigationObserver
public interface Observer extends NavigationObserver
{
void onFileSelectionChanged();
void onColumnSortOrderChanaged(List<FilesColumnSortInfo> sortList);
}

void setObserver(Observer observer);


void setColumnSortOrder(List<FilesColumnSortInfo> sortList);

void listDirectory(FileSystemItem directory,
ServerDataSource<JsArray<FileSystemItem>> filesDS);
Expand Down Expand Up @@ -141,6 +150,66 @@ private void initSession()
final SessionInfo sessionInfo = session_.getSessionInfo();
ClientInitState state = sessionInfo.getClientState();

// make the column sort order persistent
new JSObjectStateValue(MODULE_FILES,KAY_COLUMN_SORT_ORDER, true, state, false)
{
@Override
protected void onInit(JsObject value)
{
if (value != null)
columnSortOrder_ = value.cast();

lastKnownState_ = columnSortOrder_;

if (columnSortOrder_ != null)
{
ArrayList<FilesColumnSortInfo> sortOrder = new
ArrayList<FilesColumnSortInfo>();
for (int i=0; i<columnSortOrder_.length(); i++)
sortOrder.add(columnSortOrder_.get(i));

view_.setColumnSortOrder(sortOrder);
}
}

@Override
protected JsObject getValue()
{
if (columnSortOrder_ != null)
return columnSortOrder_.cast();
else
return null;
}

@Override
protected boolean hasChanged()
{
if (lastKnownState_ == null && columnSortOrder_ != null)
return true;

if (columnSortOrder_ == null && lastKnownState_ != null)
return true;

if (columnSortOrder_.length() != lastKnownState_.length())
return true;

for (int i=0; i<columnSortOrder_.length(); i++)
{
FilesColumnSortInfo sortInfo = columnSortOrder_.get(i);
FilesColumnSortInfo lastSortInfo = lastKnownState_.get(i);
if (sortInfo.getColumnIndex() != lastSortInfo.getColumnIndex())
return true;
if (sortInfo.getAscending() != lastSortInfo.getAscending())
return true;
}

return false;
}

private JsArray<FilesColumnSortInfo> lastKnownState_ = null;
};


// navigate to previous directory (works for resumed case)
new StringStateValue(MODULE_FILES, KEY_PATH, false, state) {
@Override
Expand Down Expand Up @@ -203,6 +272,16 @@ public void onSelectAllValueChanged(boolean value)
else
view_.selectNone();
}

@Override
public void onColumnSortOrderChanaged(List<FilesColumnSortInfo> sortList)
{
columnSortOrder_.setLength(0);
for (int i = 0; i<sortList.size(); i++)
columnSortOrder_.push(sortList.get(i));
}


};


Expand Down Expand Up @@ -521,5 +600,12 @@ public void requestData(
private final Provider<FilesUpload> pFilesUpload_;
private static final String MODULE_FILES = "filespane";
private static final String KEY_PATH = "path";
private static final String KAY_COLUMN_SORT_ORDER = "columnSortOrder";
private JsArray<FilesColumnSortInfo> columnSortOrder_ = newColumnArray();

private native final JsArray<FilesColumnSortInfo> newColumnArray() /*-{
return [];;
}-*/;


}
Expand Up @@ -31,10 +31,12 @@
import org.rstudio.studio.client.workbench.model.RemoteFileSystemContext;
import org.rstudio.studio.client.workbench.ui.WorkbenchPane;
import org.rstudio.studio.client.workbench.views.files.model.FileChange;
import org.rstudio.studio.client.workbench.views.files.model.FilesColumnSortInfo;
import org.rstudio.studio.client.workbench.views.files.model.PendingFileUpload;
import org.rstudio.studio.client.workbench.views.files.ui.*;

import java.util.ArrayList;
import java.util.List;

public class FilesPane extends WorkbenchPane implements Files.Display
{
Expand Down Expand Up @@ -77,6 +79,18 @@ public void onSelectAllValueChanged(boolean value)
if (observer_ != null)
observer_.onSelectAllValueChanged(value);
}

public void onColumnSortOrderChanaged(List<FilesColumnSortInfo> sortList)
{
if (observer_ != null)
observer_.onColumnSortOrderChanaged(sortList);
}
}

@Override
public void setColumnSortOrder(List<FilesColumnSortInfo> sortList)
{
filesList_.setColumnSortOrder(sortList);
}

public void listDirectory(final FileSystemItem directory,
Expand Down Expand Up @@ -219,4 +233,6 @@ protected Toolbar createMainToolbar()
private Files.Display.Observer observer_;

private final FileTypeRegistry fileTypeRegistry_;


}
@@ -0,0 +1,26 @@
package org.rstudio.studio.client.workbench.views.files.model;

import com.google.gwt.core.client.JavaScriptObject;

public class FilesColumnSortInfo extends JavaScriptObject
{
protected FilesColumnSortInfo()
{
}

public static final native FilesColumnSortInfo create(int columnIndex,
boolean ascending) /*-{
var sortInfo = new Object();
sortInfo.columnIndex = columnIndex;
sortInfo.ascending = ascending;
return sortInfo;
}-*/;

public final native int getColumnIndex() /*-{
return this.columnIndex;
}-*/;

public final native boolean getAscending() /*-{
return this.ascending;
}-*/;
}
Expand Up @@ -25,6 +25,7 @@
import org.rstudio.studio.client.common.filetypes.FileTypeRegistry;
import org.rstudio.studio.client.workbench.views.files.Files;
import org.rstudio.studio.client.workbench.views.files.model.FileChange;
import org.rstudio.studio.client.workbench.views.files.model.FilesColumnSortInfo;

import com.google.gwt.cell.client.CheckboxCell;
import com.google.gwt.cell.client.ImageResourceCell;
Expand Down Expand Up @@ -81,32 +82,8 @@ public FilesList(final Files.Display.Observer observer,
final TextColumn<FileSystemItem> sizeColumn = addSizeColumn();
final TextColumn<FileSystemItem> modColumn = addModifiedColumn();

// set initial sorting behavior
filesCellTable_.addColumnSortHandler(new Handler() {
@Override
public void onColumnSort(ColumnSortEvent event)
{
ColumnSortList sortList = event.getColumnSortList();

// insert the default initial sort order for size and modified
if (event.getColumn().equals(sizeColumn) && !didFirstSizeSort_)
{
didFirstSizeSort_ = true;
sortList.insert(0, new ColumnSortInfo(event.getColumn(), false));
}
if (event.getColumn().equals(modColumn) && !didFirstModifiedSort_)
{
didFirstModifiedSort_ = true;
sortList.insert(0, new ColumnSortInfo(event.getColumn(), false));
}

sortHandler_.onColumnSort(event);
}

private boolean didFirstSizeSort_ = false;
private boolean didFirstModifiedSort_ = false;
});
filesCellTable_.getColumnSortList().push(filesCellTable_.getColumn(2));
// initialize sorting
addColumnSortHandler(sizeColumn, modColumn);

// enclose in scroll panel
scrollPanel_ = new ScrollPanel();
Expand Down Expand Up @@ -263,6 +240,75 @@ public int compare(FileSystemItem arg0, FileSystemItem arg1)
return modColumn;
}

// TODO: does this logic still work with persistent stable sort?

private void addColumnSortHandler(final TextColumn<FileSystemItem> sizeCol,
final TextColumn<FileSystemItem> modCol)
{
filesCellTable_.addColumnSortHandler(new Handler() {
@Override
public void onColumnSort(ColumnSortEvent event)
{
ColumnSortList sortList = event.getColumnSortList();

// insert the default initial sort order for size and modified
if (event.getColumn().equals(sizeCol) && !didFirstSizeSort_)
{
didFirstSizeSort_ = true;
sortList.insert(0, new ColumnSortInfo(event.getColumn(), false));
}
if (event.getColumn().equals(modCol) && !didFirstModifiedSort_)
{
didFirstModifiedSort_ = true;
sortList.insert(0, new ColumnSortInfo(event.getColumn(), false));
}

// record sort order and fire event to observer
ArrayList<FilesColumnSortInfo> sortOrder =
new ArrayList<FilesColumnSortInfo>();
for (int i=0; i<sortList.size(); i++)
{
// match the column index
ColumnSortInfo sortInfo = sortList.get(i);
Object column = sortInfo.getColumn();

for (int c=0; c<filesCellTable_.getColumnCount(); c++)
{
if (filesCellTable_.getColumn(c).equals(column))
{
boolean ascending = sortInfo.isAscending();
sortOrder.add(FilesColumnSortInfo.create(c, ascending));
break;
}
}
}
observer_.onColumnSortOrderChanaged(sortOrder);

// delegate the sort
sortHandler_.onColumnSort(event);
}

private boolean didFirstSizeSort_ = false;
private boolean didFirstModifiedSort_ = false;
});
}


public void setColumnSortOrder(List<FilesColumnSortInfo> sortList)
{
ColumnSortList columnSortList = filesCellTable_.getColumnSortList();
columnSortList.clear();

for (int i=0; i< sortList.size(); i++)
{
FilesColumnSortInfo filesSortInfo = sortList.get(i);
ColumnSortInfo sortInfo = new ColumnSortInfo(
filesCellTable_.getColumn(filesSortInfo.getColumnIndex()),
filesSortInfo.getAscending());
columnSortList.insert(i, sortInfo);
}
}


public void clearFiles()
{
Expand Down

0 comments on commit 39ebf81

Please sign in to comment.