blob: f0601564cbaf3d04349b89481fd9ff15f8b7e42c [file] [log] [blame]
/*
* Copyright 2000-2010 JetBrains s.r.o.
*
* 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.intellij.openapi.vcs.changes.committed;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.ui.Splitter;
import com.intellij.openapi.ui.ThreeComponentsSplitter;
import com.intellij.openapi.util.Disposer;
import com.intellij.ui.IdeBorderFactory;
import com.intellij.ui.SideBorder;
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.util.HashMap;
import java.util.Map;
public class WiseSplitter implements Disposable {
private static final Border LEFT_BORDER = IdeBorderFactory.createBorder(SideBorder.TOP | SideBorder.RIGHT);
private static final Border MIDDLE_BORDER = IdeBorderFactory.createBorder(SideBorder.TOP | SideBorder.LEFT | SideBorder.RIGHT);
private final Runnable myRefresher;
private final Splitter myParentSplitter;
private final ThreeComponentsSplitter myInnerSplitter;
private final Map<CommittedChangesFilterKey, Integer> myInnerSplitterContents;
public WiseSplitter(final Runnable refresher, final Splitter parentSplitter) {
myRefresher = refresher;
myParentSplitter = parentSplitter;
myInnerSplitter = new ThreeComponentsSplitter(false);
Disposer.register(this, myInnerSplitter);
myInnerSplitter.setHonorComponentsMinimumSize(true);
myInnerSplitterContents = new HashMap<CommittedChangesFilterKey, Integer>();
updateBorders();
}
public boolean canAdd() {
return myInnerSplitterContents.size() <= 3;
}
public void add(final CommittedChangesFilterKey key, final JComponent comp) {
final int idx = myInnerSplitterContents.size();
myInnerSplitterContents.put(key, idx);
if (idx == 0) {
myParentSplitter.setFirstComponent(myInnerSplitter);
if (myParentSplitter.getProportion() < 0.05f) {
myParentSplitter.setProportion(0.25f);
}
myInnerSplitter.setFirstComponent(comp);
myInnerSplitter.setFirstSize((int) (myParentSplitter.getSize().getWidth() * myParentSplitter.getProportion()));
} else if (idx == 1) {
final Dimension dimension = myInnerSplitter.getSize();
final double width = dimension.getWidth() / 2;
myInnerSplitter.setInnerComponent(comp);
myInnerSplitter.setFirstSize((int) width);
} else {
final Dimension dimension = myInnerSplitter.getSize();
final double width = dimension.getWidth() / 3;
myInnerSplitter.setLastComponent(comp);
myInnerSplitter.setFirstSize((int) width);
myInnerSplitter.setLastSize((int) width);
}
updateBorders();
myRefresher.run();
}
private void updateBorders() {
boolean isEmpty = myInnerSplitterContents.size() == 0;
if (!isEmpty) {
setBorder(myInnerSplitter.getFirstComponent(), true);
setBorder(myInnerSplitter.getInnerComponent(), false);
}
setBorder(myParentSplitter.getSecondComponent(), isEmpty);
}
private void setBorder(JComponent c, boolean leftMost) {
if (c instanceof JScrollPane) c.setBorder(leftMost ? LEFT_BORDER : MIDDLE_BORDER);
}
public void remove(final CommittedChangesFilterKey key) {
final Integer idx = myInnerSplitterContents.remove(key);
if (idx == null) {
return;
}
final Map<CommittedChangesFilterKey, Integer> tmp = new HashMap<CommittedChangesFilterKey, Integer>();
for (Map.Entry<CommittedChangesFilterKey, Integer> entry : myInnerSplitterContents.entrySet()) {
if (entry.getValue() < idx) {
tmp.put(entry.getKey(), entry.getValue());
} else {
tmp.put(entry.getKey(), entry.getValue() - 1);
}
}
myInnerSplitterContents.clear();
myInnerSplitterContents.putAll(tmp);
if (idx == 0) {
final JComponent inner = myInnerSplitter.getInnerComponent();
myInnerSplitter.setInnerComponent(null);
myInnerSplitter.setFirstComponent(inner);
lastToInner();
} else if (idx == 1) {
lastToInner();
} else {
myInnerSplitter.setLastComponent(null);
}
updateBorders();
myRefresher.run();
}
private void lastToInner() {
final JComponent last = myInnerSplitter.getLastComponent();
myInnerSplitter.setLastComponent(null);
myInnerSplitter.setInnerComponent(last);
}
@Override
public void dispose() {
}
}