package tk.eclipse.plugin.csseditor.editors;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
import org.w3c.css.sac.InputSource;
import org.w3c.dom.css.CSSRule;
import org.w3c.dom.css.CSSRuleList;
import org.w3c.dom.css.CSSStyleRule;
import org.w3c.dom.css.CSSStyleSheet;
import tk.eclipse.plugin.htmleditor.HTMLPlugin;
import tk.eclipse.plugin.htmleditor.HTMLUtil;
import com.steadystate.css.parser.CSSOMParser;
/**
* @author Naoki Takezoe
*/
public class CSSOutlinePage extends ContentOutlinePage {
private CSSEditor editor;
private List<String> selectors = new ArrayList<String>();
public CSSOutlinePage(CSSEditor editor) {
super();
this.editor = editor;
}
@Override
public void createControl(Composite parent) {
super.createControl(parent);
TreeViewer viewer = getTreeViewer();
viewer.setContentProvider(new CSSContentProvider());
viewer.setLabelProvider(new CSSLabelProvider());
viewer.addSelectionChangedListener(new CSSSelectionChangedListener());
viewer.setInput(this.selectors);
update();
}
public void update() {
try {
CSSOMParser parser = new CSSOMParser();
InputSource is = new InputSource(new StringReader(editor.getDocumentProvider().getDocument(editor.getEditorInput()).get()));
CSSStyleSheet stylesheet = parser.parseStyleSheet(is);
this.selectors.clear();
CSSRuleList list = stylesheet.getCssRules();
for (int i = 0; i < list.getLength(); i++) {
CSSRule rule = list.item(i);
if (rule instanceof CSSStyleRule) {
CSSStyleRule styleRule = (CSSStyleRule) rule;
String selector = styleRule.getSelectorText();
this.selectors.add(selector);
}
}
getTreeViewer().refresh();
}
catch (Throwable t) {
}
}
private class CSSContentProvider implements ITreeContentProvider {
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof ArrayList) {
return ((ArrayList) parentElement).toArray();
}
return new Object[0];
}
public Object getParent(Object element) {
if (element instanceof String) {
return selectors;
}
return null;
}
public boolean hasChildren(Object element) {
if (getChildren(element).length == 0) {
return false;
}
else {
return true;
}
}
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
private class CSSSelectionChangedListener implements ISelectionChangedListener {
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection sel = (IStructuredSelection) event.getSelection();
String element = (String) sel.getFirstElement();
element = element.replaceAll("\\*", "");
String text = editor.getDocumentProvider().getDocument(editor.getEditorInput()).get();
text = HTMLUtil.cssComment2space(text);
int offset = text.indexOf(element);
if (offset >= 0) {
editor.selectAndReveal(offset, 0);
}
}
}
private class CSSLabelProvider extends LabelProvider {
@Override
public Image getImage(Object element) {
return HTMLPlugin.getDefault().getImageRegistry().get(HTMLPlugin.ICON_CSS_RULE);
}
}
}