1 /*
2  * OpenProjectDialog.java
3  *
4  * Copyright (C) 2021 by RStudio, PBC
5  *
6  * Unless you have received this program directly from RStudio pursuant
7  * to the terms of a commercial license agreement with RStudio, then
8  * this program is licensed to you under the terms of version 3 of the
9  * GNU Affero General Public License. This program is distributed WITHOUT
10  * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
11  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
12  * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
13  *
14  */
15 package org.rstudio.core.client.files.filedialog;
16 
17 import com.google.gwt.aria.client.Roles;
18 
19 import org.rstudio.core.client.Debug;
20 import org.rstudio.core.client.ElementIds;
21 import org.rstudio.core.client.files.FileSystemContext;
22 import org.rstudio.core.client.files.FileSystemItem;
23 import org.rstudio.core.client.widget.FormCheckBox;
24 import org.rstudio.core.client.widget.ProgressIndicator;
25 import org.rstudio.core.client.widget.ProgressOperationWithInput;
26 import org.rstudio.core.client.widget.ThemedButton;
27 import org.rstudio.studio.client.RStudioGinjector;
28 import org.rstudio.studio.client.projects.model.OpenProjectParams;
29 import org.rstudio.studio.client.projects.model.ProjectsServerOperations;
30 import org.rstudio.studio.client.server.ServerError;
31 import org.rstudio.studio.client.server.ServerRequestCallback;
32 
33 import com.google.gwt.event.dom.client.ClickEvent;
34 import com.google.gwt.event.dom.client.ClickHandler;
35 import com.google.gwt.event.logical.shared.ValueChangeEvent;
36 import com.google.gwt.event.logical.shared.ValueChangeHandler;
37 import com.google.gwt.user.client.ui.CheckBox;
38 import com.google.inject.Inject;
39 
40 public class OpenProjectDialog extends FileDialog
41 {
OpenProjectDialog(FileSystemContext context, int defaultType, boolean newSessionOption, final ProgressOperationWithInput<OpenProjectParams> operation)42    public OpenProjectDialog(FileSystemContext context,
43                 int defaultType,
44                 boolean newSessionOption,
45                 final ProgressOperationWithInput<OpenProjectParams> operation)
46    {
47       super("Open Project", null, Roles.getDialogRole(), "Open", false, false, false, context,
48             "R Projects (*.RProj)",
49             new ProgressOperationWithInput<FileSystemItem>()
50             {
51                @Override
52                public void execute(FileSystemItem input,
53                      ProgressIndicator indicator)
54                {
55                   // NOTE: we currently do not expose R version selection
56                   // for the open project dialog since projects already
57                   // have a pinned R version by default
58                   operation.execute(new OpenProjectParams(input,
59                                                           null,
60                                                           inNewSession_),
61                         indicator);
62                }
63             });
64 
65       RStudioGinjector.INSTANCE.injectMembers(this);
66 
67       // Used to create a project in an existing directory which
68       // does not already have a .Rproj file.
69       ThemedButton createButton = new ThemedButton("Create", new ClickHandler()
70       {
71          @Override
72          public void onClick(ClickEvent event)
73          {
74             server_.createProjectFile(
75                   browser_.getCurrentDirectory().getPath(),
76                   new ServerRequestCallback<String>()
77                   {
78                      @Override
79                      public void onResponseReceived(String response)
80                      {
81                         accept(FileSystemItem.createFile(response));
82                      }
83 
84                      @Override
85                      public void onError(ServerError error)
86                      {
87                         Debug.logError(error);
88                         accept();
89                      }
90                   });
91          }
92       });
93       addButton(createButton, ElementIds.CREATE_BUTTON);
94 
95       newSessionCheck_ = new FormCheckBox("Open in new session", ElementIds.OP_NEW_SESSION);
96       newSessionCheck_.addValueChangeHandler(new ValueChangeHandler<Boolean>()
97       {
98          @Override
99          public void onValueChange(ValueChangeEvent<Boolean> event)
100          {
101             inNewSession_ = event.getValue();
102          }
103       });
104       if (newSessionOption)
105          addLeftWidget(newSessionCheck_);
106    }
107 
108    @Inject
initialize(ProjectsServerOperations server)109    private void initialize(ProjectsServerOperations server)
110    {
111       server_ = server;
112    }
113 
114    private CheckBox newSessionCheck_;
115    private static boolean inNewSession_ = false;
116 
117    // Injected ----
118    private ProjectsServerOperations server_;
119 }
120