/**
* This file is part of HIDB2.
*
* HIDB2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PoJamas is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser Public License for more details.
*
* You should have received a copy of the GNU Lesser Public License
* along with HIDB2. If not, see <http://www.gnu.org/licenses/>.
*/
package hidb2.gui;
import static hidb2.kern.AttrType.T_Object;
import hidb2.gui.editor.HIDB2Toolkit;
import hidb2.gui.util.FormLayoutFactory;
import hidb2.gui.util.PojoCellModifier;
import hidb2.gui.util.PojoColumnDescr;
import hidb2.gui.util.PoserTableViewer;
import hidb2.kern.AttrType;
import hidb2.kern.Attribut;
import hidb2.kern.AttributedDescription;
import hidb2.kern.CardDescription;
import hidb2.kern.DataStore;
import hidb2.kern.Folder;
import hidb2.kern.FolderDescription;
import hidb2.kern.FolderSearchQuery;
import hidb2.kern.FolderSearchResult;
import hidb2.kern.HIDBConst;
import hidb2.kern.QueryAttr;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.logging.Logger;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.IViewPart;
/**
* Cube view parameters dialog.
* Manage cube options and CubeView filling.
*
*/
public class DlgCubeParam extends Dialog implements HIDBConst
{
final static Logger log = Logger.getLogger("hidb2.gui");
private int _res = C_FAIL;
private Shell _dlg;
private CubicView _cubicView;
private Combo _cmbDescr;
private PoserTableViewer _tbl;
private ComboBoxCellEditor _cmbCellEditor = null;
private FolderSearchQuery _query = new FolderSearchQuery();
/**
* Search dialog creation.
* @param parent
* @param searchView
*/
public DlgCubeParam(Shell parent, IViewPart cubicView)
{
super(parent, SWT.DIALOG_TRIM);
_cubicView = (CubicView) cubicView;
_dlg = new Shell(parent.getShell(), SWT.DIALOG_TRIM);
_dlg.setText("Search Options");
_dlg.setLayout(new GridLayout(1, false));
// Create FolderDescriptionList Panel
createFolderPanel();
// Validation Button
Composite panButton = new Group(_dlg, SWT.NONE);
GridData gdPan = new GridData();
gdPan.grabExcessHorizontalSpace = true;
gdPan.horizontalAlignment = SWT.FILL;
panButton.setLayoutData(gdPan);
RowLayout rowLayout2 = new RowLayout(SWT.HORIZONTAL);
rowLayout2.fill = true;
rowLayout2.wrap = false;
rowLayout2.justify = true;
rowLayout2.pack = false;
panButton.setLayout(rowLayout2);
Button btnValid = new Button(panButton, SWT.PUSH);
btnValid.setText("OK");
// Button btnReindex = new Button(panButton, SWT.PUSH);
// btnReindex.setText("reIndex");
// Cancel Button
Button btnCancel = new Button(panButton, SWT.PUSH);
btnCancel.setText("Cancel");
btnValid.addSelectionListener(new SelectionAdapter()
{
public void widgetSelected(SelectionEvent e)
{
// Read cube options
_res = C_OK;
_dlg.close();
}
});
btnCancel.addSelectionListener(new SelectionAdapter()
{
public void widgetSelected(SelectionEvent e)
{
_res = C_FAIL;
_dlg.close();
}
});
// btnReindex.addSelectionListener(new SelectionAdapter()
// {
// public void widgetSelected(SelectionEvent e)
// {
// try
// {
// IRunnableWithProgress op = new IRunnableWithProgress()
// {
// public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException
// {
// try
// {
// FullTextLucene.reindex(Application.getDataStore().getCnx());
// }
// catch (SQLException e1)
// {
// log.warning("ReIndexation failed");
// e1.printStackTrace();
// }
// }
// };
//
// new ProgressMonitorDialog(getParent()).run(true, false, op);
// }
//
// catch (InvocationTargetException eit)
// {
// // handle exception
// eit.printStackTrace();
// }
//
// catch (InterruptedException eie)
// {
// // handle cancelation
// eie.printStackTrace();
// }
// }
// });
_dlg.setDefaultButton(btnValid);
_dlg.pack();
}
/**
* Create FolderDescriptionList Panel
*/
private void createFolderPanel()
{
Composite panel = new Group(_dlg, SWT.NONE);
GridData gdPan = new GridData();
gdPan.grabExcessHorizontalSpace = true;
gdPan.horizontalAlignment = SWT.FILL;
panel.setLayoutData(gdPan);
panel.setLayout(new GridLayout(2, false));
_cmbDescr = new Combo(panel, SWT.READ_ONLY | SWT.DROP_DOWN);
GridData gdCmb = new GridData();
gdCmb.grabExcessHorizontalSpace = true;
gdCmb.horizontalAlignment = SWT.FILL;
gdCmb.minimumWidth = 200;
_cmbDescr.setLayoutData(gdCmb);
_cmbDescr.addSelectionListener(new SelectionAdapter()
{
public void widgetSelected(SelectionEvent e)
{
int idx = _cmbDescr.getSelectionIndex();
FolderDescription nfd = Application.getDataStore().getFolderDescriptionList().get(idx);
if (_query.fd != nfd)
{
_query.fd = nfd;
String[] tblAttrName = new String[nfd.getAttributList().size()];
int i = 0;
for (Attribut a : nfd.getAttributList())
{
tblAttrName[i++] = a.getName();
}
_cmbCellEditor.setItems(tblAttrName);
_query.lstQAttr.clear();
_tbl.refresh();
}
}
});
Label labA = new Label(panel, SWT.NONE);
labA.setText("Attributes");
_tbl = new PoserTableViewer(panel);
GridData gdTbl = new GridData();
gdTbl.grabExcessHorizontalSpace = true;
gdTbl.horizontalAlignment = SWT.FILL;
gdTbl.minimumHeight = 60;
gdTbl.heightHint = 100;
_tbl.setLayoutData(gdTbl);
_tbl.addAttribut(new PojoColumnDescr("Attr", T_Object, "Attr", 80)
{
public CellEditor createCellEditor(final Table table)
{
if ((_cellEdt == null) && editable)
{
String[] tblAttrName = new String[0];
_cellEdt = new ComboBoxCellEditor(table, tblAttrName);
_cmbCellEditor = (ComboBoxCellEditor) _cellEdt;
}
return _cellEdt;
}
});
_tbl.addROAttribut("Type", AttrType.T_String, "Type", 80);
// _tbl.addAttribut(new PojoColumnDescr("Test", AttrType.T_Object, "Test", 50)
// {
// public CellEditor createCellEditor(final Table table)
// {
// if ((_cellEdt == null) && editable)
// {
// int i = 0;
// QueryAttr.T_Test[] te = QueryAttr.T_Test.values();
// String[] tblAttrName = new String[te.length];
//
// for (QueryAttr.T_Test e : te)
// {
// tblAttrName[i++] = e.text;
// }
//
// _cellEdt = new ComboBoxCellEditor(table, tblAttrName);
// }
//
// return _cellEdt;
// }
// });
_tbl.addAttribut("Min", AttrType.T_String, "Min", 60);
_tbl.addAttribut("Max", AttrType.T_String, "Max", 60);
_tbl.addAttribut("Step", AttrType.T_String, "Grad", 60);
HIDB2Toolkit toolkit = new HIDB2Toolkit(_dlg.getDisplay());
Composite containerBtn = toolkit.createComposite(panel, SWT.NONE);
containerBtn.setLayout(FormLayoutFactory.createClearGridLayout(true, 1));
/*Button btnAddAfter =*/toolkit.createGridButton(containerBtn, "Add", new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
QueryAttr qa = new QueryAttr();
_query.lstQAttr.add(qa);
_tbl.refresh();
}
});
/*Button btnRem =*/toolkit.createGridButton(containerBtn, "Delete", new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
ISelection selection = _tbl.getSelection();
if (!selection.isEmpty())
{
Object obj = ((IStructuredSelection) selection).getFirstElement();
QueryAttr qattr = (QueryAttr) obj;
// Execute the deletion
_query.lstQAttr.remove(qattr);
_tbl.refresh();
}
}
});
_tbl.createMMI();
// Add a specific CellModifier to manage Combo indexes <-> Real Value
_tbl.setCellModifier(new PojoCellModifier(_tbl)
{
@Override
public Object getValue(Object element, String property)
{
Object o = null;
if (property.equals("Attr"))
{
int idxName = _query.fd.getAttributList().indexOf(element);
o = new Integer(idxName);
}
// else
// {
// o = super.getValue(element, property);
//
// if (property.equals("Test"))
// {
// o = new Integer(((Enum<?>) o).ordinal());
// }
// }
return o;
}
@Override
public void modify(Object element, String property, Object value)
{
if (property.equals("Attr"))
{
int index = (Integer) value;
value = _query.fd.getAttributList().get(index);
}
// else
// {
// if (property.equals("Test"))
// {
// int index = (Integer) value;
// value = QueryAttr.T_Test.values()[index];
// }
// }
super.modify(element, property, value);
}
});
}
/**
* Open the search specification dialog.
*
* @return
*/
public int open()
{
// Fill fields
// _chkAllWord.setSelection(_query.allWord);
// _chkAnyFolder.setSelection(_query.useAnyFolder);
// _chkCaseSensitive.setSelection(_query.caseSensitive);
// _txtSearched.setText(_query.searchPattern);
List<FolderDescription> lstDescr = Application.getDataStore().getFolderDescriptionList();
String[] tabItems = new String[lstDescr.size()];
int i = 0;
for (FolderDescription f : lstDescr)
{
tabItems[i++] = f.getName() + "[" + f.getNbInstance() + "]";
}
_cmbDescr.setItems(tabItems);
_cmbDescr.select(0);
_cmbDescr.setEnabled(!_query.useAnyFolder);
_tbl.setInput(_query.lstQAttr);
_dlg.open();
while (!_dlg.isDisposed())
{
if (!_dlg.getDisplay().readAndDispatch())
_dlg.getDisplay().sleep();
}
_dlg.dispose();
if (_res == C_OK)
{
try
{
IRunnableWithProgress op = new IRunnableWithProgress()
{
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException
{
int rc = C_OK;
DataStore das = Application.getDataStore();
List<FolderSearchResult> lstSR = das.search(_query);
if (rc == C_OK)
{
// Display search results
for (FolderSearchResult fsr : lstSR)
{
FolderDescription fd = null;
CardDescription cd = null;
boolean isCard = false;
// Retrieve FolderDescription
AttributedDescription ad = das.find(fsr.getTableName());
if (ad instanceof CardDescription)
{
cd = (CardDescription) ad;
fd = cd.getParent();
isCard = true;
}
else
{
if (ad instanceof FolderDescription)
{
fd = (FolderDescription) ad;
}
}
if (fd != null) // Ignore ListDescription
{
_cubicView.addFolderDescription(fd);
for (int id : fsr.getKeys())
{
Folder f = isCard ? das.find(cd, id) : das.find(fd, id);
_cubicView.addFolder(f);
}
}
}
}
}
};
new ProgressMonitorDialog(getParent()).run(true, false, op);
}
catch (InvocationTargetException e)
{
// handle exception
e.printStackTrace();
}
catch (InterruptedException e)
{
// handle cancelation
e.printStackTrace();
}
}
return _res;
}
}