/*
 * Copyright 2014-2015 Open Networking Laboratory
 *
 * Licensed 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.onosproject.byon.gui;

import org.onosproject.ui.UiTopoOverlay;

/**
 * Network Topology Overlay hooks.
 */
public class NetworkTopoOverlay extends UiTopoOverlay {
    // NOTE: this must match the ID defined in uiRefTopov.js
    private static final String OVERLAY_ID = "byon-overlay";

//    private static final String MY_TITLE = "My App Rocks!";
//    private static final String MY_VERSION = "Beta-1.0.0042";
//    private static final String MY_DEVICE_TITLE = "I changed the title";
//
//    private static final ButtonId FOO_BUTTON = new ButtonId("foo");
//    private static final ButtonId BAR_BUTTON = new ButtonId("bar");

    public NetworkTopoOverlay() {
        super(OVERLAY_ID);
    }

/*
    @Override
    public void modifySummary(PropertyPanel pp) {
        pp.title(MY_TITLE)
                .typeId(TopoConstants.Glyphs.CROWN)
                .removeProps(
                        TOPOLOGY_SSCS,
                        INTENTS,
                        TUNNELS,
                        FLOWS,
                        VERSION
                )
                .addProp(VERSION, MY_VERSION);
    }

    @Override
    public void modifyDeviceDetails(PropertyPanel pp, DeviceId deviceId) {
        pp.title(MY_DEVICE_TITLE);
        pp.removeProps(LATITUDE, LONGITUDE);

        pp.addButton(FOO_BUTTON)
                .addButton(BAR_BUTTON);

        pp.removeButtons(TopoConstants.CoreButtons.SHOW_PORT_VIEW)
                .removeButtons(TopoConstants.CoreButtons.SHOW_GROUP_VIEW);
    }
*/

}
