45af23f3cf86234c50dab3129a0f0b83a833c52c
[idea/community.git] / platform / vcs-impl / src / com / intellij / openapi / vcs / changes / committed / IncomingChangesViewProvider.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
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 package com.intellij.openapi.vcs.changes.committed;
17
18 import com.intellij.openapi.actionSystem.ActionGroup;
19 import com.intellij.openapi.actionSystem.ActionManager;
20 import com.intellij.openapi.actionSystem.ActionToolbar;
21 import com.intellij.openapi.actionSystem.AnAction;
22 import com.intellij.openapi.application.ApplicationManager;
23 import com.intellij.openapi.project.Project;
24 import com.intellij.openapi.vcs.RepositoryLocation;
25 import com.intellij.openapi.vcs.VcsBundle;
26 import com.intellij.openapi.vcs.VcsException;
27 import com.intellij.openapi.vcs.changes.ui.ChangesViewContentProvider;
28 import com.intellij.openapi.vcs.versionBrowser.CommittedChangeList;
29 import com.intellij.util.Consumer;
30 import com.intellij.util.messages.MessageBus;
31 import com.intellij.util.messages.MessageBusConnection;
32 import org.jetbrains.annotations.Nullable;
33
34 import javax.swing.*;
35 import java.awt.*;
36 import java.util.Collections;
37 import java.util.List;
38
39 /**
40  * @author yole
41  */
42 public class IncomingChangesViewProvider implements ChangesViewContentProvider {
43   private final Project myProject;
44   private final MessageBus myBus;
45   private CommittedChangesTreeBrowser myBrowser;
46   private MessageBusConnection myConnection;
47   private final JLabel myErrorLabel = new JLabel();
48
49   public IncomingChangesViewProvider(final Project project, final MessageBus bus) {
50     myProject = project;
51     myBus = bus;
52   }
53
54   public JComponent initContent() {
55     myBrowser = new CommittedChangesTreeBrowser(myProject, Collections.<CommittedChangeList>emptyList());
56     myBrowser.setEmptyText(VcsBundle.message("incoming.changes.not.loaded.message"));
57     ActionGroup group = (ActionGroup) ActionManager.getInstance().getAction("IncomingChangesToolbar");
58     final ActionToolbar toolbar = myBrowser.createGroupFilterToolbar(myProject, group, null, Collections.<AnAction>emptyList());
59     myBrowser.setToolBar(toolbar.getComponent());
60     myBrowser.setTableContextMenu(group, Collections.<AnAction>emptyList());
61     myConnection = myBus.connect();
62     myConnection.subscribe(CommittedChangesCache.COMMITTED_TOPIC, new MyCommittedChangesListener());
63     loadChangesToBrowser(false);
64
65     JPanel contentPane = new JPanel(new BorderLayout());
66     contentPane.add(myBrowser, BorderLayout.CENTER);
67     contentPane.add(myErrorLabel, BorderLayout.SOUTH);
68     myErrorLabel.setForeground(Color.red);
69     return contentPane;
70   }
71
72   public void disposeContent() {
73     myConnection.disconnect();
74     myBrowser = null;
75   }
76
77   private void updateModel(final boolean inBackground) {
78     ApplicationManager.getApplication().invokeLater(new Runnable() {
79       public void run() {
80         if (myProject.isDisposed()) return;
81         if (myBrowser != null) {
82           loadChangesToBrowser(inBackground);
83         }
84       }
85     });
86   }
87
88   private void loadChangesToBrowser(final boolean inBackground) {
89     final CommittedChangesCache cache = CommittedChangesCache.getInstance(myProject);
90     cache.hasCachesForAnyRoot(new Consumer<Boolean>() {
91       public void consume(final Boolean notEmpty) {
92         if (Boolean.TRUE.equals(notEmpty)) {
93           final List<CommittedChangeList> list = cache.getCachedIncomingChanges();
94           if (list != null) {
95             myBrowser.setEmptyText(VcsBundle.message("incoming.changes.empty.message"));
96             myBrowser.setItems(list, false, CommittedChangesBrowserUseCase.INCOMING);
97           }
98           else {
99             cache.loadIncomingChangesAsync(null, inBackground);
100           }
101         }
102       }
103     });
104   }
105
106   private class MyCommittedChangesListener extends CommittedChangesAdapter {
107     public void changesLoaded(final RepositoryLocation location, final List<CommittedChangeList> changes) {
108       updateModel(true);
109     }
110
111     public void incomingChangesUpdated(final List<CommittedChangeList> receivedChanges) {
112       updateModel(true);
113     }
114
115     public void refreshErrorStatusChanged(@Nullable final VcsException lastError) {
116       ApplicationManager.getApplication().invokeLater(new Runnable() {
117         public void run() {
118           if (lastError != null) {
119             myErrorLabel.setText("Error refreshing changes: " + lastError.getMessage());
120           }
121           else {
122             myErrorLabel.setText("");
123           }
124         }
125       });
126     }
127   }
128 }