import java.util.Vector;\r
\r
import org.apache.log4j.Logger;\r
+import org.eclipse.jface.dialogs.MessageDialog;\r
+import org.eclipse.jface.viewers.ICellEditorValidator;\r
import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;\r
import org.eclipse.ui.views.properties.IPropertyDescriptor;\r
import org.eclipse.ui.views.properties.IPropertySource;\r
import eu.etaxonomy.cdm.common.CdmUtils;\r
import eu.etaxonomy.cdm.model.agent.Team;\r
import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;\r
+import eu.etaxonomy.cdm.model.common.TimePeriod;\r
import eu.etaxonomy.cdm.model.reference.Article;\r
import eu.etaxonomy.cdm.model.reference.BibtexReference;\r
import eu.etaxonomy.cdm.model.reference.Book;\r
import eu.etaxonomy.cdm.model.reference.Thesis;\r
import eu.etaxonomy.cdm.model.reference.WebPage;\r
import eu.etaxonomy.taxeditor.ITaxEditorConstants;\r
+import eu.etaxonomy.taxeditor.UiUtil;\r
+import eu.etaxonomy.taxeditor.model.CdmUtil;\r
+import eu.etaxonomy.taxeditor.propertysheet.CheckboxPropertyDescriptor;\r
\r
/**\r
* Supplies the properties of a <code>ReferenceBase</code> object for display by\r
}\r
\r
protected Vector<PropertyDescriptor> descriptors = new Vector<PropertyDescriptor>();\r
+\r
+ private TextPropertyDescriptor yearDescriptor;\r
\r
protected void addDescriptor(String id) {\r
if (id.equals(P_ID_REFERENCETYPE)) {\r
new TextPropertyDescriptor(P_ID_AUTHORTEAM, P_AUTHORTEAM)); \r
}\r
if (id.equals(P_ID_YEAR)) {\r
- descriptors.addElement(\r
- new TextPropertyDescriptor(P_ID_YEAR, P_YEAR)); \r
+ yearDescriptor = new TextPropertyDescriptor(P_ID_YEAR, P_YEAR);\r
+ yearDescriptor.setValidator(new ICellEditorValidator() {\r
+\r
+ public String isValid(Object value) {\r
+ String year = (String) value;\r
+ logger.warn(year);\r
+ if (year.equals("")) {\r
+ return null;\r
+ }\r
+ if (reference instanceof BibtexReference) {\r
+ return null;\r
+ }\r
+ if (reference instanceof StrictReferenceBase) {\r
+ try {\r
+ TimePeriod datePublished = CdmUtil.getDatePublished(year);\r
+ } catch (NumberFormatException e) {\r
+ return "Year must be between 1750 and 2030.\n\nTwo years can also be given in the format 'xxxx-xxxx'.";\r
+ }\r
+ }\r
+ return null;\r
+ }\r
+ \r
+ });\r
+ descriptors.addElement(yearDescriptor);\r
+// descriptors.addElement(\r
+// new TextPropertyDescriptor(P_ID_YEAR, P_YEAR)); \r
}\r
if (id.equals(P_ID_CITATION)) {\r
descriptors.addElement(\r
} \r
if (id.equals(P_ID_INPROCEEDINGS)) {\r
descriptors.addElement(\r
- new TextPropertyDescriptor(P_ID_INPROCEEDINGS, P_INPROCEEDINGS)); \r
+// new TextPropertyDescriptor(P_ID_INPROCEEDINGS, P_INPROCEEDINGS));\r
+ new CheckboxPropertyDescriptor(P_ID_INPROCEEDINGS, P_INPROCEEDINGS));\r
} \r
}\r
\r
*/\r
public Object getPropertyValue(Object id) {\r
\r
+ if (id.equals(P_ID_INPROCEEDINGS)) {\r
+ return Boolean.TRUE;\r
+ }\r
+ \r
// Reference Type: get integer index of drop-down menu\r
if (id.equals(P_ID_REFERENCETYPE)) {\r
Class referenceClass = reference.getClass();\r
\r
/**\r
* Executes <code>methodName</code> on <code>obj</code> with\r
- * the arguments <code>args</code>.\r
+ * the argument <code>arg</code>.\r
+ * <p>\r
+ * On failure, returns <code>null</code>.\r
* <p>\r
- * On failure, returns <code>null</code>. \r
+ * NOTE: both <code>Class.getMethod()</code> and <code>Method.invoke()</code>\r
+ * can be called with the <code>Object... args</code> approach, which allows\r
+ * the user to pass in a varying number of arguments. To keep it simple, and since\r
+ * this is usually only getters or setters, we are using only one argument.\r
* @param obj\r
* @param methodName\r
* @param args\r
* @return\r
*/\r
- private Object invokeMethod(Object obj, String methodName, Object... args) {\r
+ private Object invokeMethod(Object obj, String methodName, Object arg) {\r
try {\r
- if (args != null) {\r
- logger.warn(args.length);\r
- for (Object arg : args) {\r
- logger.warn("ARG " + arg.toString());\r
- }\r
- }\r
Method method = null;\r
- if (methodName.equals("setTitle"))\r
- method= obj.getClass().getMethod(methodName, String.class);\r
- else\r
- method = obj.getClass().getMethod(methodName, null);\r
- return method.invoke(obj, args);\r
+ if (arg == null) {\r
+ method = obj.getClass().getMethod(methodName);\r
+ return method.invoke(obj);\r
+ } else {\r
+ method = obj.getClass().getMethod(methodName, arg.getClass());\r
+ return method.invoke(obj, arg);\r
+ }\r
} catch (SecurityException e) {\r
logger.error(e.getMessage());\r
} catch (IllegalArgumentException e) {\r
- logger.error(e .getMessage());\r
+ logger.error(e.getMessage());\r
} catch (NoSuchMethodException e) {\r
logger.error(e.getMessage());\r
} catch (IllegalAccessException e) {\r
return null;\r
}\r
\r
- private Object createBibRefPropertySource(Journal inJournal) {\r
- // TODO Auto-generated method stub\r
- return null;\r
- }\r
-\r
/* (non-Javadoc)\r
* @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)\r
*/\r
\r
// Year\r
if (id.equals(P_ID_YEAR)) {\r
-// reference.getYear\r
+ String year = (String) value;\r
+ if (reference instanceof BibtexReference) {\r
+ ((BibtexReference) reference).setYear(year);\r
+ }\r
+ if (reference instanceof StrictReferenceBase) {\r
+ try {\r
+ TimePeriod datePublished = null;\r
+ if (!year.equals("")) {\r
+ datePublished = CdmUtil.getDatePublished(year); \r
+ }\r
+ ((StrictReferenceBase) reference).setDatePublished(datePublished);\r
+ } catch (NumberFormatException e) { \r
+ \r
+ // HACK to deal with the following sequence of events:\r
+ // 1) focus moved to another cell\r
+ // 2) Year cell is notified, calls setPropertyValue\r
+ // 3) setPropertyValue opens MessageDialog, and does not complete until user feedback\r
+ // 4) the new cell checks whether there is another active cell in PropertySheetViewer\r
+ // 5) since the MessageDialog is open, Year cell is still "active" in PropertySheetViewer\r
+ // 6) therefore, the new cell tries to close the Year cell, in the process calling setPropertyViewer \r
+ // again and causing MessageDialog to pop up again\r
+// if (!isMessageDialogOpen) {\r
+// isMessageDialogOpen = true;\r
+// MessageDialog.openError(UiUtil.getShell(), "Invalid year format", "Year must be between 1750 and 2030.\n\nTwo years can also be given in the format 'xxxx-xxxx'.");\r
+// isMessageDialogOpen = false;\r
+// }\r
+ return;\r
+ }\r
+ }\r
}\r
\r
// Title: used by StrictReferenceBase\r
propertyChangeSupport.firePropertyChange(ITaxEditorConstants.PROPERTY_SHEET_CHANGE, null, reference); \r
}\r
\r
+ static boolean isMessageDialogOpen;\r
+ \r
/**\r
* Takes a <code>referenceClass</code>, then executes either its <code>NewInstance()</code> \r
* method or its constructor. Puts the resulting object in <code>this.reference</code> and\r