blob: e5e8b61f261efe0c8c9f209acd2401b329c07724 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.sling.ide.eclipse.ui.views;
import java.util.Map;
import java.util.Map.Entry;
import javax.jcr.PropertyType;
import javax.jcr.nodetype.PropertyDefinition;
import org.apache.sling.ide.eclipse.ui.nav.model.JcrNode;
import org.apache.sling.ide.eclipse.ui.nav.model.JcrProperty;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
public class JcrCellLabelProvider extends CellLabelProvider {
private final TableViewer viewer;
private Color greyColor;
private Color normalColor;
public JcrCellLabelProvider(TableViewer viewer) {
this.viewer = viewer;
Display display = viewer.getControl().getDisplay();
greyColor = display.getSystemColor(SWT.COLOR_DARK_GRAY);
normalColor = viewer.getTable().getForeground();
}
@Override
public void update(ViewerCell cell) {
int index = cell.getColumnIndex();
if (!isNewRow(cell)) {
if (canEdit(cell)) {
cell.setForeground(normalColor);
} else {
cell.setForeground(greyColor);
}
}
if (index==0) {
updateName(cell);
return;
} else if (index==1) {
final Object element = cell.getElement();
if (element instanceof NewRow) {
NewRow newRow = (NewRow)element;
int propertyType = newRow.getType();
String type = PropertyType.nameFromValue(propertyType);
cell.setText(type);
} else if (element instanceof IPropertyDescriptor) {
IPropertyDescriptor pd = (IPropertyDescriptor)element;
JcrNode jcrNode = (JcrNode)viewer.getInput();
Map.Entry me = (Entry) pd.getId();
final String propertyName = String.valueOf(me.getKey());
int propertyType = jcrNode.getPropertyType(propertyName);
if (propertyType<=-1 || propertyType==PropertyType.UNDEFINED) {
cell.setText("");
} else {
final JcrProperty property = jcrNode.getProperty(propertyName);
String type = PropertyType.nameFromValue(propertyType);
if (property!=null && property.isMultiple()) {
type = type + "[]";
}
cell.setText(type);
}
} else {
cell.setText("");
}
return;
} else if (index==2) {
updateValue(cell);
return;
} else {
final Object element = cell.getElement();
if (element instanceof NewRow) {
NewRow newRow = (NewRow)element;
cell.setText("");
} else if (element instanceof IPropertyDescriptor) {
IPropertyDescriptor pd = (IPropertyDescriptor)element;
JcrNode jcrNode = (JcrNode)viewer.getInput();
Map.Entry me = (Entry) pd.getId();
PropertyDefinition prd = jcrNode.getPropertyDefinition(String.valueOf(me.getKey()));
if (index==3) {
// protected
if (prd!=null) {
cell.setText(String.valueOf(prd.isProtected()));
} else {
cell.setText("false");
}
} else if (index==4) {
// mandatory
if (prd!=null) {
cell.setText(String.valueOf(prd.isMandatory()));
} else {
cell.setText("false");
}
} else if (index==5) {
// multiple
if (prd!=null) {
cell.setText(String.valueOf(prd.isMultiple()));
} else {
cell.setText(String.valueOf(jcrNode.getProperty(String.valueOf(me.getKey())).isMultiple()));
}
} else if (index==6) {
// auto creatd
if (prd!=null) {
cell.setText(String.valueOf(prd.isAutoCreated()));
} else {
cell.setText("false");
}
} else {
cell.setText("n/a");
return;
}
}
}
}
private boolean canEdit(ViewerCell cell) {
Object element = cell.getElement();
if (element instanceof NewRow) {
// can edit everything of a newrow (other than type properties)
if (cell.getColumnIndex()>2) {
return false;
}
return true;
} else if (element instanceof IPropertyDescriptor){
if (cell.getColumnIndex()>2 && cell.getColumnIndex()!=5) {
return false;
}
IPropertyDescriptor pd = (IPropertyDescriptor)element;
JcrNode jcrNode = (JcrNode)viewer.getInput();
Map.Entry me = (Entry) pd.getId();
if (me.getKey().equals("jcr:primaryType")) {
return cell.getColumnIndex()==2;
} else {
return true;
}
} else {
// otherwise this is an unknown/unsupported cell element
return false;
}
}
private boolean isNewRow(ViewerCell cell) {
return (cell.getElement() instanceof NewRow);
}
private void updateValue(ViewerCell cell) {
final Object element = cell.getElement();
if (element instanceof NewRow) {
NewRow newRow = (NewRow)element;
cell.setText(String.valueOf(newRow.getValue()));
} else if (element instanceof IPropertyDescriptor) {
IPropertyDescriptor pd = (IPropertyDescriptor)element;
JcrNode jcrNode = (JcrNode)viewer.getInput();
// jcrNode.getProperties().getPropertyValue(pd);
Map.Entry me = (Entry) pd.getId();
final String rawValue = String.valueOf(me.getValue());
int index = rawValue.indexOf("}");
if (index!=-1) {
cell.setText(rawValue.substring(index+1));
} else {
cell.setText(rawValue);
}
} else {
cell.setText(String.valueOf(element));
}
}
private void updateName(ViewerCell cell) {
final Object element = cell.getElement();
if (element instanceof NewRow) {
NewRow newRow = (NewRow)element;
cell.setText(String.valueOf(newRow.getName()));
} else if (element instanceof IPropertyDescriptor) {
IPropertyDescriptor pd = (IPropertyDescriptor)element;
cell.setText(pd.getDisplayName());
} else {
cell.setText(String.valueOf(element));
}
}
}