package AVS3;
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public class DlgUserGrpVerwaltung extends JDialog {
private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
private JPanel jPanelUser = null;
private JPanel jPanelGruppe = null;
private JPanel jPanelSouth = null;
private JButton jButtonSpeichern = null;
private JLabel jLabel = null;
private JButton jButtonAbbruch = null;
private JLabel jLabelUser = null;
private JLabel jLabelGruppe = null;
private JList list=null;
public DlgUserGrpVerwaltung(final Frame owner) {
super(owner);
initialize();
}
private void initialize() {
final Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize();
final int x_pos = (int) (screenDimension.getWidth() / 2.0f - 500.0f / 2.0f);
final int y_pos = (int) ((screenDimension.getHeight() / 2.0f - 400.0f / 2.0f)-100);
this.setBounds(new Rectangle(x_pos, y_pos, 500, 400));
this.setResizable(false);
this.setContentPane(getJContentPane());
}
private JPanel getJContentPane() {
if (jContentPane == null) {
jLabelUser = new JLabel();
jLabelUser.setBounds(new Rectangle(15, 15, 225, 25));
jLabelUser.setText(Text.user);
jLabelUser.setHorizontalAlignment(JLabel.CENTER);
jLabelUser.setFont(new Font(GlobaleVariablen.standart_label1_schrift_typ, GlobaleVariablen.standart_label1_schrift_font, GlobaleVariablen.standart_label1_schrift_groesse));
jLabelGruppe = new JLabel();
jLabelGruppe.setBounds(new Rectangle(250, 15, 225, 25));
jLabelGruppe.setText(Text.gruppen);
jLabelGruppe.setHorizontalAlignment(JLabel.CENTER);
jLabelGruppe.setFont(new Font(GlobaleVariablen.standart_label1_schrift_typ, GlobaleVariablen.standart_label1_schrift_font, GlobaleVariablen.standart_label1_schrift_groesse));
jContentPane = new JPanel();
jContentPane.setLayout(null);
jContentPane.add(getJPanelUser(), null);
jContentPane.add(getJPanelGruppe(), null);
jContentPane.add(getJPanelSouth(), null);
jContentPane.add(jLabelUser, null);
jContentPane.add(jLabelGruppe, null);
}
return jContentPane;
}
private JPanel getJPanelUser() {
if (jPanelUser == null) {
jPanelUser = new JPanel();
jPanelUser.setLayout(new GridLayout(1,1));
jPanelUser.setBounds(new Rectangle(15, 55, 225, 260));
jPanelUser.add(createListUser(Text.CLUser));
}
return jPanelUser;
}
private JPanel getJPanelGruppe() {
if (jPanelGruppe == null) {
jPanelGruppe = new JPanel();
jPanelGruppe.setLayout(new GridLayout(1,1));
jPanelGruppe.setBounds(new Rectangle(250, 55, 225, 260));
jPanelGruppe.add(createListGruppe(Text.CLGruppe));
}
return jPanelGruppe;
}
private JPanel getJPanelSouth() {
if (jPanelSouth == null) {
jLabel = new JLabel();
jLabel.setText("");
jLabel.setPreferredSize(new Dimension(40, 0));
jPanelSouth = new JPanel();
jPanelSouth.setLayout(new FlowLayout());
jPanelSouth.setBounds(new Rectangle(0, 333, 493, 40));
jPanelSouth.add(getJButtonSpeichern(), null);
jPanelSouth.add(jLabel, null);
jPanelSouth.add(getJButtonAbbruch(), null);
}
return jPanelSouth;
}
private JButton getJButtonSpeichern() {
if (jButtonSpeichern == null) {
jButtonSpeichern = new JButton();
jButtonSpeichern.setText(Text.jButtonSpeichern);
jButtonSpeichern.setPreferredSize(new Dimension(100, 30));
jButtonSpeichern.setFont(new Font(GlobaleVariablen.standart_jbutton_schrift_typ, GlobaleVariablen.standart_jbutton_schrift_font, GlobaleVariablen.standart_jbutton_schrift_groesse));
jButtonSpeichern.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
int len = list.getModel().getSize();
for(int i=0; i<len; i++){
String grp_name = getTitle(list, i);
int grp_id=DB.getGrpID(grp_name);
DB.delUserGrpRechte(grp_id);
}
for(int i=0; i<len; i++){
DefaultListModel model = (DefaultListModel)list.getModel();
String grp_name = getTitle(list, i);
int grp_id=DB.getGrpID(grp_name);
if((i>0)&&(getTitle(list, i).compareToIgnoreCase(getTitle(list, (i-1)))==0)){
String user_name=model.getElementAt(i).toString();
DB.setUserGrpRechte(user_name, grp_id, grp_name);
}
}
AVS3.trace(Text.TRAUserGrpGespeichert, 0);
dispose();
}
});
}
return jButtonSpeichern;
}
private JButton getJButtonAbbruch() {
if (jButtonAbbruch == null) {
jButtonAbbruch = new JButton();
jButtonAbbruch.setPreferredSize(new Dimension(100, 30));
jButtonAbbruch.setText(Text.jButtonAbbruch);
jButtonAbbruch.setFont(new Font(GlobaleVariablen.standart_jbutton_schrift_typ, GlobaleVariablen.standart_jbutton_schrift_font, GlobaleVariablen.standart_jbutton_schrift_groesse));
jButtonAbbruch.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
dispose();
}
});
}
return jButtonAbbruch;
}
private JPanel createListUser(final String listId) {
DefaultListModel model = new DefaultListModel();
String erg[]=DB.getUser();
for(int i=0; i<erg.length; i++){
if(erg[i]==null){
break;
}
String erg_split[]=GlobaleFunction.split(erg[i], ": ");
model.addElement(erg_split[1]);
}
JList list = new JList(model);
list.setName(listId);
list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
JScrollPane scrollPane = new JScrollPane(list);
scrollPane.setPreferredSize(new Dimension(225, 250));
list.setDragEnabled(true);
list.setTransferHandler(new ListTransferHandler());
JPanel panel = new JPanel();
panel.add(scrollPane);
return panel;
}
private JPanel createListGruppe(final String listId) {
DefaultListModel model = new DefaultListModel();
String erg[]=DB.getGrps();
for(int i=0; i<erg.length; i++){
if(erg[i]==null){
break;
}
String erg_split[]=GlobaleFunction.split(erg[i], ": ");
if(erg_split[1].compareToIgnoreCase("keine")!=0){
model.addElement(new GroupItem(erg_split[1]));
int grp_id=Integer.parseInt(erg_split[0]);
String erg_user[]=DB.getUserGrpRechte(grp_id);
int len = erg_user.length;
for(int c=0; c<len; c++){
if(erg_user[c]==null){
break;
}
model.addElement(erg_user[c]);
}
}
}
list = new JList(model);
list.setName(listId);
list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
JScrollPane scrollPane = new JScrollPane(list);
scrollPane.setPreferredSize(new Dimension(225, 250));
list.setDragEnabled(true);
ListTransferHandler th = new ListTransferHandler();
list.setTransferHandler(th);
list.setCellRenderer(new GroupCellRenderer());
list.setDropTarget(new GroupDropTarget(th));
list.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
if(e.getValueIsAdjusting()) return;
}
});
JPanel panel = new JPanel();
panel.add(scrollPane);
return panel;
}
private String getTitle(final JList list, final int index){
DefaultListModel model = (DefaultListModel)list.getModel();
for (int start = index; start > -1; start--) {
Object val = model.getElementAt(start);
if(val instanceof GroupItem) return val.toString();
}
return null;
}
abstract class DataTransferHandler extends TransferHandler {
private int actions = COPY_OR_MOVE;
protected int dropAction;
protected abstract Object exportListData(JComponent c);
protected abstract void importListData(JComponent c, String str);
protected abstract void cleanup(JComponent c, boolean remove);
protected Transferable createTransferable(final JComponent c) {
return new GenericTransferable(exportListData(c));
}
public int getSourceActions(final JComponent c) {
return actions;
}
public boolean importData(final JComponent c, final Transferable t) {
JList source = (JList)c;
if(source.getName().compareToIgnoreCase(Text.CLGruppe)==0){
if (canImport(c, t.getTransferDataFlavors())) {
try {
String str = (String)t.getTransferData(DataFlavor.stringFlavor);
importListData(c, str);
sortAll(source);
return true;
} catch (UnsupportedFlavorException ufe) {
} catch (IOException ioe) {
}
}
}else{
return true;
}
return false;
}
protected void exportDone(final JComponent c, final Transferable trans, final int action) {
Object data = null;
JList source = (JList)c;
if(source.getName().compareToIgnoreCase(Text.CLGruppe)==0){
try {data = trans.getTransferData(DataFlavor.stringFlavor);
} catch (IOException ex) {
} catch (UnsupportedFlavorException ex) {}
cleanup(c, !(data instanceof GroupItem) );
}
}
public boolean canImport(final JComponent c, final DataFlavor[] flavors) {
for (int ndx = 0; ndx < flavors.length; ndx++) {
if (DataFlavor.stringFlavor.equals(flavors[ndx])) {
return true;
}
}
return false;
}
private void sortAll(final JList target) {
if(!target.getName().equalsIgnoreCase(Text.CLGruppe)) return;
DefaultListModel model = (DefaultListModel)target.getModel();
SortedSet<String> grp = null;
int from = 0;
int index = 0;
for (index = 0; index < model.getSize(); index++) {
Object val = model.getElementAt(index);
if(val instanceof GroupItem){
sortGrp(grp, model, from+1, index-1);
grp = new TreeSet<String>();
from = index;
}else{
grp.add(val.toString());
}
}
sortGrp(grp, model, from+1, index-1);
}
private void sortGrp(final SortedSet grp, final DefaultListModel model, final int from, final int to) {
if(grp == null || from >= to) return;
model.removeRange(from, to);
Iterator<String> it = grp.iterator();
int start = from;
while(it.hasNext())
model.insertElementAt(it.next(), start++);
}
}
class ListTransferHandler extends DataTransferHandler {
public JList target;
public int[] rows = null;
public int addIndex = -1; //Position an der die Zeilen eingefügt werden
public int addCount = 0; //Anzahl der eingefügten Zeilen.
private int dropIndex;
protected Object exportListData(final JComponent c) {
JList list = (JList)c;
rows = list.getSelectedIndices();
StringBuffer buff = new StringBuffer();
if(rows != null){
for (int ndx = 0; ndx < rows.length; ndx++) {
Object val = ((DefaultListModel)list.getModel()).getElementAt(rows[ndx]);
if( !(val instanceof GroupItem) ){
buff.append(val == null ? "" : val.toString());
if (ndx != rows.length - 1) {
buff.append("\n");
}
}else{
return val;
}
}
}
return buff.toString();
}
protected void importListData(final JComponent c, final String str) {
target = (JList)c;
DefaultListModel model = (DefaultListModel)target.getModel();
//Der Benutzer wird daran gehindert die Daten auf sich selbst fallen zu lassen.
//Zum Beispiel, wenn der Benutzer die Zeilen #4,#5,#6 und #7 verschiebt und
//versucht sie unterhalb der Zeile #5 einzufügen, wäre es
//problematisch die ursprünglichen Zeilen zu entfernen.
//Daher wird dies nicht erlaubt.
if (rows != null && dropIndex >= rows[0] - 1 &&
dropIndex <= rows[rows.length - 1]) {
rows = null;
return;
}
if(rows != null && inSameGroup(dropIndex, rows[0], model)){
rows = null;
return;
}
int max = model.getSize();
if (dropIndex < 0) {
dropIndex = max;
} else {
dropIndex++;
if (dropIndex > max) {
dropIndex = max;
}
}
addIndex = dropIndex;
String[] values = str.split("\n");
addCount = 0;
for (int ndx = 0; ndx < values.length ; ndx++) {
Object obj = values[ndx];
if(!exists(obj, dropIndex, model)){
model.insertElementAt( obj, dropIndex++);
addCount++;
}
}
//Wenn wir Zeilen innerhalb derselben Liste verschieben, müssen
//wir die Zeilen entsprechend anpassen, da diejenigen
//hinter dem Einfügungspunkt verschoben werden.
if (rows!= null && addCount > 0) {
for (int ndx = 0; ndx < rows.length; ndx++) {
if (rows[ndx] > addIndex) {
rows[ndx] += addCount;
}
}
}
}
protected void cleanup(final JComponent c, final boolean remove) {
JList source = (JList)c;
if (dropAction == MOVE && remove && rows != null) {
DefaultListModel model = (DefaultListModel)source.getModel();
for (int ndx = rows.length - 1; ndx >= 0; ndx--) {
model.removeElementAt(rows[ndx]);
}
}
rows = null;
addCount = 0;
addIndex = -1;
}
protected void setIndex(final int index) {
dropIndex = index;
}
private boolean exists(final Object obj, final int dropIndex, final DefaultListModel model) {
for (int row = dropIndex; row < model.getSize(); row++) {
Object val = model.getElementAt(row);
if(val instanceof GroupItem) break;
if(val.toString().equals(obj.toString())){
return rows==null?true:!inSameGroup(row, rows[0], model);
}
}
for (int row = dropIndex-1; row > -1; row--) {
Object val = model.getElementAt(row);
if(val instanceof GroupItem) break;
if(val.toString().equals(obj.toString())){
return rows==null?true:!inSameGroup(row, rows[0], model);
}
}
return false;
}
private boolean inSameGroup(final int row, final int row1, final DefaultListModel model) {
List<Integer> grp = null;
for (int index = 0; index < model.getSize(); index++) {
Object val = model.getElementAt(index);
if(val instanceof GroupItem){
if(grp != null && grp.contains(row) && grp.contains(row1))return true;
grp = new ArrayList<Integer>();
grp.add(index);
}else grp.add(index);
}
if(grp != null && grp.contains(row) && grp.contains(row1))return true;
return false;
}
private void setAction(int i) {
super.dropAction = i;
}
}
class GroupDropTarget extends DropTarget{
private ListTransferHandler handler;
private Insets autoscrollInsets = new Insets(20, 20, 20, 20);
public GroupDropTarget(final ListTransferHandler th){
handler = th;
}
public void drop(final DropTargetDropEvent dtde) {
Object data = null;
try {data = dtde.getTransferable().getTransferData(DataFlavor.stringFlavor);
} catch (IOException ex) {
} catch (UnsupportedFlavorException ex) {}
if( !(data instanceof GroupItem) ){
Point p = dtde.getLocation();
JList list = (JList) getComponent();
int index = list.locationToIndex(p);
handler.setIndex(index);
handler.importData(list, dtde.getTransferable());
super.drop(dtde);
}
}
public void dragOver(DropTargetDragEvent dtde) {
handler.setAction(dtde.getDropAction());
JList list = (JList) dtde.getDropTargetContext().getComponent();
Point loc = dtde.getLocation();
autoscroll(list, loc);
super.dragOver(dtde);
}
private void autoscroll(JList list, Point cursorLocation) {
Insets insets = getAutoscrollInsets();
Rectangle outer = list.getVisibleRect();
Rectangle inner = new Rectangle(
outer.x+insets.left,
outer.y+insets.top,
outer.width-(insets.left+insets.right),
outer.height-(insets.top+insets.bottom));
if (!inner.contains(cursorLocation)) {
Rectangle scrollRect = new Rectangle(
cursorLocation.x-insets.left,
cursorLocation.y-insets.top,
insets.left+insets.right,
insets.top+insets.bottom);
list.scrollRectToVisible(scrollRect);
}
}
private Insets getAutoscrollInsets() {
return autoscrollInsets;
}
}
class GenericTransferable implements Transferable{
private Object data;
public GenericTransferable(final Object data){
this.data = data;
}
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[]{DataFlavor.stringFlavor};
}
public boolean isDataFlavorSupported(final DataFlavor flavor) {
return true;
}
public Object getTransferData(final DataFlavor flavor) throws UnsupportedFlavorException, IOException {
return data;
}
}
class GroupItem{
private String item;
public GroupItem(final String str){item = str;}
public String toString() {return item;}
}
class GroupCellRenderer extends DefaultListCellRenderer {
private Color bg = new Color(159, 152, 150);
private Color bg2 = new Color(130, 130, 125);
public Component getListCellRendererComponent(
final JList list, final Object value, final int index, final boolean selected, final boolean focus){
super.getListCellRendererComponent(list, value, index, selected, focus);
if(!selected){
setForeground(Color.BLACK);
setBackground(Color.WHITE);
}
setHorizontalAlignment(JLabel.LEFT);
setBorder(BorderFactory.createEmptyBorder());
if(value instanceof GroupItem){
setBorder(BorderFactory.createLineBorder(bg2));
setHorizontalAlignment(JLabel.CENTER);
setFont(getFont().deriveFont(14f));
setForeground(Color.BLACK);
setBackground(bg);
}
return this;
}
}
}