// Copyright 2012 Jeeeyul Lee, Seoul, Korea
// https://github.com/jeeeyul/pde-tools
//
// This module is multi-licensed and may be used under the terms
// of any of the following licenses:
//
// EPL, Eclipse Public License, V1.0 or later, http://www.eclipse.org/legal
// LGPL, GNU Lesser General Public License, V2.1 or later, http://www.gnu.org/licenses/lgpl.html
// GPL, GNU General Public License, V2 or later, http://www.gnu.org/licenses/gpl.html
// AL, Apache License, V2.0 or later, http://www.apache.org/licenses
// BSD, BSD License, http://www.opensource.org/licenses/bsd-license.php
// MIT, MIT License, http://www.opensource.org/licenses/MIT
//
// Please contact the author if you need another license.
// This module is provided "as is", without warranties of any kind.
package net.jeeeyul.eclipse.themes.rendering;
import java.util.HashSet;
import java.util.Set;
import javax.inject.Inject;
import net.jeeeyul.eclipse.themes.CSSClasses;
import net.jeeeyul.eclipse.themes.UpdateCTabFolderClassesJob;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
public class ChromeTabRendering extends HackedCTabRendering {
private CTabFolder tabFolder;
private int lastKnownTabHeight = -1;
private static Set<ChromeTabRendering> INSTANCES = new HashSet<>();
public static Set<ChromeTabRendering> getInstances() {
return INSTANCES;
}
private UpdateCTabFolderClassesJob updateTags;
private boolean showShineyShadow;
@Inject
public ChromeTabRendering(CTabFolder tabFolder) {
super(tabFolder);
this.tabFolder = tabFolder;
updateTags = new UpdateCTabFolderClassesJob(tabFolder);
tabFolder.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
updateEmptyClassIfNeeded();
}
});
tabFolder.addListener(SWT.Dispose, new Listener() {
@Override
public void handleEvent(Event event) {
INSTANCES.remove(this);
}
});
INSTANCES.add(this);
}
public void applyChromeThemePreference() {
}
@Override
protected void dispose() {
super.dispose();
}
@Override
protected void draw(int part, int state, Rectangle bounds, GC gc) {
if (parent.isDisposed() || gc.isDisposed()) {
return;
}
updateEmptyClassIfNeeded();
if (part == PART_BODY && !isPreviewingTab()) {
/*
* 7: Editor area - Minimize / maximize look brocken
* https://github.com/jeeeyul/eclipse-themes/issues/issue/7
*
* Calculated tab height of empty tab seens to cause this problems.
*/
if (tabFolder.getItemCount() == 0) {
if (lastKnownTabHeight < 0) {
lastKnownTabHeight = tabFolder.getFont().getFontData()[0]
.getHeight() + 19;
}
tabFolder.setTabHeight(lastKnownTabHeight);
} else {
tabFolder.setTabHeight(-1);
lastKnownTabHeight = tabFolder.getTabHeight();
}
}
super.draw(part, state, bounds, gc);
}
private boolean isPreviewingTab() {
CSSClasses tags = CSSClasses.getStyleClasses(tabFolder);
return tags.contains("chrome-tabfolder-preview");
}
public boolean isShowShineyShadow() {
return showShineyShadow;
}
public void setShowShineyShadow(boolean showShineyShadow) {
this.showShineyShadow = showShineyShadow;
}
@Override
protected boolean showUnselectedTabItemShadow() {
return showShineyShadow;
}
private void updateEmptyClassIfNeeded() {
CSSClasses tags = CSSClasses.getStyleClasses(tabFolder);
boolean haveToSetEmpty = tabFolder.getItemCount() == 0;
if (haveToSetEmpty && !tags.contains("empty")) {
updateTags.schedule();
updateItems();
} else if (!haveToSetEmpty && !tags.contains("nonEmpty")) {
updateTags.schedule();
updateItems();
}
}
}