Java tutorial
/******************************************************************************* * Copyright (c) 2008, 2009 Internettechnik, FH JOANNEUM * http://www.fh-joanneum.at/itm * * Licenced under the GNU GENERAL PUBLIC LICENSE Version 2; * You may obtain a copy of the License at * http://www.gnu.org/licenses/gpl-2.0.txt * * This program 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 General Public License for more details. *******************************************************************************/ package at.rc.tacos.client.editors; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CLabel; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IWorkbenchPartConstants; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.events.HyperlinkAdapter; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.widgets.ExpandableComposite; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ImageHyperlink; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.ui.part.EditorPart; import at.rc.tacos.client.controller.EditorCloseAction; import at.rc.tacos.client.controller.EditorSaveAction; import at.rc.tacos.client.modelManager.ModelFactory; import at.rc.tacos.client.providers.MobilePhoneContentProvider; import at.rc.tacos.client.providers.MobilePhoneLabelProvider; import at.rc.tacos.client.providers.StationContentProvider; import at.rc.tacos.client.providers.StationLabelProvider; import at.rc.tacos.client.util.CustomColors; import at.rc.tacos.core.net.NetWrapper; import at.rc.tacos.factory.ImageFactory; import at.rc.tacos.model.Location; import at.rc.tacos.model.MobilePhoneDetail; import at.rc.tacos.model.VehicleDetail; public class VehicleDetailEditor extends EditorPart implements PropertyChangeListener { public static final String ID = "at.rc.tacos.client.editors.vehicleDetailEditor"; // properties boolean isDirty; private FormToolkit toolkit; private ScrolledForm form; // changeable values private CLabel infoLabel; private ImageHyperlink saveHyperlink, removeHyperlink; private Text vehicleType, vehicleName; private ComboViewer basicLocationViewer, phoneViewer, currentLocationViewer; // managed data private VehicleDetail detail; private boolean isNew; /** * Default class constructor */ public VehicleDetailEditor() { ModelFactory.getInstance().getVehicleManager().addPropertyChangeListener(this); ModelFactory.getInstance().getPhoneManager().addPropertyChangeListener(this); } /** * Cleanup */ @Override public void dispose() { ModelFactory.getInstance().getVehicleManager().removePropertyChangeListener(this); ModelFactory.getInstance().getPhoneManager().removePropertyChangeListener(this); } /** * This is a callback that will allow us to create the viewer and initialize * it. */ @Override public void createPartControl(final Composite parent) { detail = ((VehicleDetailEditorInput) getEditorInput()).getVehicle(); isNew = ((VehicleDetailEditorInput) getEditorInput()).isNew(); // Create the form toolkit = new FormToolkit(CustomColors.FORM_COLOR(parent.getDisplay())); form = toolkit.createScrolledForm(parent); toolkit.decorateFormHeading(form.getForm()); form.getBody().setLayout(new GridLayout()); form.getBody().setLayoutData(new GridData(GridData.FILL_BOTH)); // create the content createManageSection(form.getBody()); createDetailSection(form.getBody()); // load the data loadData(); // reset the dirty flag isDirty = false; // force redraw form.pack(true); } /** * Creates the section to manage the changes */ private void createManageSection(Composite parent) { Composite client = createSection(parent, "Fahrzeuge verwalten"); // create info label and hyperlinks to save and revert the changes infoLabel = new CLabel(client, SWT.NONE); infoLabel.setText("Hier knnen sie das aktuelle Fahrzeug verwalten und die nderungen speichern."); infoLabel.setImage(ImageFactory.getInstance().getRegisteredImage("admin.info")); // Create the hyperlink to save the changes saveHyperlink = toolkit.createImageHyperlink(client, SWT.NONE); saveHyperlink.setText("nderungen speichern"); saveHyperlink.setEnabled(false); saveHyperlink.setForeground(CustomColors.GREY_COLOR); saveHyperlink.setImage(ImageFactory.getInstance().getRegisteredImage("admin.saveDisabled")); saveHyperlink.addHyperlinkListener(new HyperlinkAdapter() { @Override public void linkActivated(HyperlinkEvent e) { EditorSaveAction saveAction = new EditorSaveAction(); saveAction.run(); } }); // Create the hyperlink to remove the competence removeHyperlink = toolkit.createImageHyperlink(client, SWT.NONE); removeHyperlink.setText("Fahrzeug lschen"); removeHyperlink.setImage(ImageFactory.getInstance().getRegisteredImage("admin.vehicleRemove")); removeHyperlink.addHyperlinkListener(new HyperlinkAdapter() { @Override public void linkActivated(HyperlinkEvent e) { boolean result = MessageDialog.openConfirm(getSite().getShell(), "Lschen des Fahrzeuges besttigen", "Mchten sie das Fahrzeug " + detail.getVehicleType() + "-" + detail.getVehicleName() + " wirklich lschen?"); if (!result) return; // reset the dirty flag to prevent the 'save changes' to popup // on a deleted item isDirty = false; // send the remove request NetWrapper.getDefault().sendRemoveMessage(VehicleDetail.ID, detail); } }); // info label should span over two GridData data = new GridData(GridData.FILL_BOTH); data.horizontalSpan = 2; data.widthHint = 600; infoLabel.setLayoutData(data); } /** * Creates the section containing the competence details * * @param parent * the parent composite */ private void createDetailSection(Composite parent) { Composite client = createSection(parent, "Fahrzeug Details"); // label and the text field final Label labelVehicleType = toolkit.createLabel(client, "Fahrzeug Typ"); vehicleType = toolkit.createText(client, ""); vehicleType.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent me) { inputChanged(); } }); final Label labelVehicleName = toolkit.createLabel(client, "Fahrzeug Name"); vehicleName = toolkit.createText(client, ""); vehicleName.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent me) { inputChanged(); } }); final Label labelBasicLoaction = toolkit.createLabel(client, "Basis Dienststelle"); Combo stationCombo = new Combo(client, SWT.READ_ONLY); basicLocationViewer = new ComboViewer(stationCombo); basicLocationViewer.setContentProvider(new StationContentProvider()); basicLocationViewer.setLabelProvider(new StationLabelProvider()); basicLocationViewer.setInput(ModelFactory.getInstance().getLocationManager()); stationCombo.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent me) { inputChanged(); } }); // mobile phone final Label labelPhone = toolkit.createLabel(client, "Mobiltelefon"); Combo phoneCombo = new Combo(client, SWT.READ_ONLY); phoneViewer = new ComboViewer(phoneCombo); phoneViewer.setContentProvider(new MobilePhoneContentProvider()); phoneViewer.setLabelProvider(new MobilePhoneLabelProvider()); phoneViewer.setInput(ModelFactory.getInstance().getPhoneManager().getMobilePhoneList()); phoneCombo.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent me) { inputChanged(); } }); // current location final Label locationLabel = toolkit.createLabel(client, "Aktuelle Ortsstelle"); Combo currentLocationCombo = new Combo(client, SWT.READ_ONLY); currentLocationViewer = new ComboViewer(currentLocationCombo); currentLocationViewer.setContentProvider(new StationContentProvider()); currentLocationViewer.setLabelProvider(new StationLabelProvider()); currentLocationViewer.setInput(ModelFactory.getInstance().getLocationManager()); currentLocationCombo.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent me) { inputChanged(); } }); // set the layout for the composites GridData data = new GridData(); data.widthHint = 150; labelVehicleType.setLayoutData(data); data = new GridData(); data.widthHint = 150; labelVehicleName.setLayoutData(data); data = new GridData(); data.widthHint = 150; labelBasicLoaction.setLayoutData(data); data = new GridData(); data.widthHint = 150; labelPhone.setLayoutData(data); data = new GridData(); data.widthHint = 150; locationLabel.setLayoutData(data); // layout for the text fields GridData data2 = new GridData(GridData.FILL_HORIZONTAL); vehicleName.setLayoutData(data2); data2 = new GridData(GridData.FILL_HORIZONTAL); vehicleType.setLayoutData(data2); data2 = new GridData(GridData.FILL_HORIZONTAL); basicLocationViewer.getCombo().setLayoutData(data2); phoneViewer.getCombo().setLayoutData(data2); data2 = new GridData(GridData.FILL_HORIZONTAL); currentLocationViewer.getCombo().setLayoutData(data2); data2 = new GridData(GridData.FILL_HORIZONTAL); data2.heightHint = 100; } /** * Loads the data and shows them in the view */ private void loadData() { // init the editor if (isNew) { removeHyperlink.setVisible(false); form.setText("Neues Fahrzeug anlegen"); return; } // enable the remove link removeHyperlink.setVisible(true); // load all the data form.setText("Details des Fahrzeugs: " + detail.getVehicleType() + " " + detail.getVehicleName()); vehicleName.setText(detail.getVehicleName()); vehicleType.setText(detail.getVehicleType()); if (detail.getBasicStation() != null) basicLocationViewer.setSelection(new StructuredSelection(detail.getBasicStation())); if (detail.getMobilePhone() != null) phoneViewer.setSelection(new StructuredSelection(detail.getMobilePhone())); if (detail.getCurrentStation() != null) currentLocationViewer.setSelection(new StructuredSelection(detail.getCurrentStation())); } @Override public void doSave(IProgressMonitor monitor) { // reset error message form.setMessage(null, IMessageProvider.NONE); // just set and validate the changeable values if (vehicleType.getText().trim().isEmpty()) { form.getDisplay().beep(); form.setMessage("Bitte geben Sie den Fahrzeugtyp an", IMessageProvider.ERROR); return; } detail.setVehicleType(vehicleType.getText()); // validate the name if (vehicleName.getText().trim().isEmpty()) { form.getDisplay().beep(); form.setMessage("Bitte geben Sie einen Fahrzeugnamen ein", IMessageProvider.ERROR); return; } detail.setVehicleName(vehicleName.getText()); // basic location int index = basicLocationViewer.getCombo().getSelectionIndex(); if (index == -1) { form.getDisplay().beep(); form.setMessage("Bitte ordnen Sie diesem Fahrzeug eine Basis Ortsstelle zu", IMessageProvider.ERROR); return; } detail.setBasicStation((Location) basicLocationViewer.getElementAt(index)); // mobile phone int index2 = phoneViewer.getCombo().getSelectionIndex(); if (index2 == -1) { form.getDisplay().beep(); form.setMessage("Bitte ordnen Sie diesem Fahrzeug eine Handynummer zu", IMessageProvider.ERROR); return; } detail.setMobilPhone((MobilePhoneDetail) phoneViewer.getElementAt(index2)); // current location int index3 = currentLocationViewer.getCombo().getSelectionIndex(); if (index3 == -1) { form.getDisplay().beep(); form.setMessage("Bitte ordnen Sie diesem Fahrzeug eine aktuelle Ortsstelle zu", IMessageProvider.ERROR); } detail.setCurrentStation((Location) currentLocationViewer.getElementAt(index3)); // the other fields are read only and must not be set explicite if (isNew) NetWrapper.getDefault().sendAddMessage(VehicleDetail.ID, detail); else NetWrapper.getDefault().sendUpdateMessage(VehicleDetail.ID, detail); } @Override public void doSaveAs() { // not supported } @Override public void init(IEditorSite site, IEditorInput input) throws PartInitException { setSite(site); setInput(input); setPartName(input.getName()); } @Override public void setFocus() { form.setFocus(); } @Override public boolean isDirty() { return isDirty; } @Override public boolean isSaveAsAllowed() { // not supported return false; } @Override public void propertyChange(PropertyChangeEvent evt) { if ("VEHICLE_UPDATE".equals(evt.getPropertyName()) || "VEHICLE_ADD".equalsIgnoreCase(evt.getPropertyName())) { VehicleDetail updateVehicle = null; // get the new value if (evt.getNewValue() instanceof VehicleDetail) updateVehicle = (VehicleDetail) evt.getNewValue(); // assert we have a value if (updateVehicle == null) return; // is this vehicle is the current one -> update it if (detail.equals(updateVehicle) || (detail.getVehicleName().equalsIgnoreCase(updateVehicle.getVehicleName()) && detail.getVehicleType().equalsIgnoreCase(updateVehicle.getVehicleType()))) { // save the updated competence setInput(new VehicleDetailEditorInput(updateVehicle, false)); setPartName(updateVehicle.getVehicleType() + " " + updateVehicle.getVehicleName()); detail = updateVehicle; isNew = false; // update the editor loadData(); // show the result isDirty = false; infoLabel.setText("nderungen gespeichert"); infoLabel.setImage(ImageFactory.getInstance().getRegisteredImage("info.ok")); Display.getCurrent().beep(); } } if ("VEHICLE_REMOVE".equalsIgnoreCase(evt.getPropertyName())) { // the removed vehicle VehicleDetail removedVehicle = (VehicleDetail) evt.getOldValue(); // the current edited if (detail.equals(removedVehicle)) { MessageDialog.openInformation(getSite().getShell(), "Fahrzeug wurde gelscht", "Das Fahrzeug welches Sie gerade editieren wurde gelscht"); EditorCloseAction closeAction = new EditorCloseAction( PlatformUI.getWorkbench().getActiveWorkbenchWindow()); closeAction.run(); } } // keep on track on location changes if ("LOCATION_ADD".equalsIgnoreCase(evt.getPropertyName()) || "LOCATION_REMOVE".equalsIgnoreCase(evt.getPropertyName()) || "LOCATION_UPDATE".equalsIgnoreCase(evt.getPropertyName())) { // just refresh the combo so that the new data is loaded basicLocationViewer.refresh(true); currentLocationViewer.refresh(true); } // keep on track on phone changes if ("PHONE_ADD".equalsIgnoreCase(evt.getPropertyName()) || "PHONE_UPDATE".equalsIgnoreCase(evt.getPropertyName()) || "PHONE_REMOVE".equalsIgnoreCase(evt.getPropertyName())) { phoneViewer.refresh(true); } } /** * Creates and returns a section and a composite with two colums * * @param parent * the parent composite * @param sectionName * the title of the section * @return the created composite to hold the other widgets */ private Composite createSection(Composite parent, String sectionName) { // create the section Section section = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE); toolkit.createCompositeSeparator(section); section.setText(sectionName); section.setLayout(new GridLayout()); section.setLayoutData(new GridData( GridData.BEGINNING | GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING)); section.setExpanded(true); // composite to add the client area Composite client = new Composite(section, SWT.NONE); section.setClient(client); // layout GridLayout layout = new GridLayout(); layout.numColumns = 2; layout.makeColumnsEqualWidth = false; client.setLayout(layout); GridData clientDataLayout = new GridData(GridData.BEGINNING | GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_BOTH); client.setLayoutData(clientDataLayout); return client; } /** * This is called when the input of a text box or a combo box was changes */ private void inputChanged() { // get the current input VehicleDetailEditorInput vehicleInput = (VehicleDetailEditorInput) getEditorInput(); VehicleDetail persistantVehicle = vehicleInput.getVehicle(); // reset the flag isDirty = false; // check the vehicle name if (!vehicleName.getText().equalsIgnoreCase(persistantVehicle.getVehicleName())) { isDirty = true; } // check the vehicle type if (!vehicleType.getText().equalsIgnoreCase(persistantVehicle.getVehicleType())) { isDirty = true; } // check the basic location if (!basicLocationViewer.getSelection().isEmpty()) { IStructuredSelection structuredSelection = (IStructuredSelection) basicLocationViewer.getSelection(); Location selectedLocation = (Location) structuredSelection.getFirstElement(); if (!selectedLocation.equals(persistantVehicle.getBasicStation())) isDirty = true; } // check the current location if (!currentLocationViewer.getSelection().isEmpty()) { IStructuredSelection structuredSelection = (IStructuredSelection) currentLocationViewer.getSelection(); Location selectedLocation = (Location) structuredSelection.getFirstElement(); if (!selectedLocation.equals(persistantVehicle.getCurrentStation())) isDirty = true; } // check the phone if (!phoneViewer.getSelection().isEmpty()) { IStructuredSelection structuredSelection = (IStructuredSelection) phoneViewer.getSelection(); MobilePhoneDetail selectedPhone = (MobilePhoneDetail) structuredSelection.getFirstElement(); if (!selectedPhone.equals(persistantVehicle.getMobilePhone())) isDirty = true; } // notify the user that the input has changes if (isDirty) { infoLabel.setText("Bitte speichern Sie ihre lokalen nderungen."); infoLabel.setImage(ImageFactory.getInstance().getRegisteredImage("info.warning")); saveHyperlink.setEnabled(true); saveHyperlink.setForeground(CustomColors.COLOR_LINK); saveHyperlink.setImage(ImageFactory.getInstance().getRegisteredImage("admin.save")); } else { infoLabel.setText("Hier knnen sie das aktuelle Fahrzeug verwalten und die nderungen speichern."); infoLabel.setImage(ImageFactory.getInstance().getRegisteredImage("admin.info")); saveHyperlink.setEnabled(false); saveHyperlink.setForeground(CustomColors.GREY_COLOR); saveHyperlink.setImage(ImageFactory.getInstance().getRegisteredImage("admin.saveDisabled")); } // set the dirty flag firePropertyChange(IWorkbenchPartConstants.PROP_DIRTY); } }